我在Visual C ++ 2010上运行这段代码
char c[10];
cin.get(&c[0],5);
cin.get(&c[2],4);
cout << c << endl;
如果我将“123456789”提供给cin
,cout
子句将打印“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字符,所以我不知道为什么会这样。谁能给我提示?
答案 0 :(得分:4)
发生的事情是,如果basic_iostream::getline()
达到要读取的字符数限制(streamsize
参数减1),它会停止读取,然后在读取的数据之后放置一个空字符。它还在流上设置failbit
。
因此,假设流已准备好"123456789"
,当您致电cin.get(&c[0],5)
时,数组将{'1','2','3','4','\0'}
放入元素0
到4
。并且在流上设置了failbit
。
现在,当您拨打cin.get(&c[2],4)
时,会在流上设置failbit
,因此不会读取任何内容。 getline()
调用什么都不做,只是将终止空值放在索引2
的数组中(即使没有从流中读取任何内容,getline()
也会放置空字符 - 即使非-read是因为failbit
)。所以数组现在看起来像:
{'1','2','\0','4','\0'}
您链接的文档提及:
如果函数因达到此大小而停止读取,则会设置failbit内部标志。
但是getline()
做了很多,所以很容易错过这个细节。