cin.getline将字符串的开头设置为'\ 0'

时间:2012-03-20 22:46:12

标签: c++ iostream getline cin

我在Visual C ++ 2010上运行这段代码

char c[10];
cin.get(&c[0],5);
cin.get(&c[2],4);
cout << c << endl;

如果我将“123456789”提供给cincout子句将打印“12567”,这是我预期的结果。

但如果我写:

char c[10];
cin.getline(&c[0],5);
cin.getline(&c[2],4);
cout<< c <<endl;

并输入相同的字符串,它只显示“12”,其中c == {'1','2','\ 0','4','\ 0'}

根据documentation,cin.get和cin.getline之间的区别在于cin.get不会像cin.getline那样丢弃delim字符,所以我不知道为什么会这样。谁能给我提示?

1 个答案:

答案 0 :(得分:4)

发生的事情是,如果basic_iostream::getline()达到要读取的字符数限制(streamsize参数减1),它会停止读取,然后在读取的数据之后放置一个空字符。它还在流上设置failbit

因此,假设流已准备好"123456789",当您致电cin.get(&c[0],5)时,数组将{'1','2','3','4','\0'}放入元素04。并且在流上设置了failbit

现在,当您拨打cin.get(&c[2],4)时,会在流上设置failbit,因此不会读取任何内容。 getline()调用什么都不做,只是将终止空值放在索引2的数组中(即使没有从流中读取任何内容,getline()也会放置空字符 - 即使非-read是因为failbit)。所以数组现在看起来像:

{'1','2','\0','4','\0'}

您链接的文档提及:

  

如果函数因达到此大小而停止读取,则会设置failbit内部标志。

但是getline()做了很多,所以很容易错过这个细节。