【问题标题】:cin.getline sets the begin of a string a '\0'cin.getline 将字符串的开头设置为 '\0'
【发布时间】:2012-04-05 11:21:45
【问题描述】:

我在 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字符,所以不知道为什么会这样。谁能给我提示?

【问题讨论】:

  • 绝对不能在不检查返回值的情况下使用 I/O 函数。
  • eofbit、badbit等是什么样的?
  • @user1200129 是的,我检查了三个位,“失败位”是真的,但我不知道为什么。
  • 你认为这不值得一提吗?这意味着你的结果完全没有意义,而且你已经知道了。
  • @LightnessRacesinOrbit 我的疏忽。

标签: c++ iostream getline cin


【解决方案1】:

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

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

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

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

您链接到的文档提到了这一点:

如果函数因为达到这个大小而停止读取,则设置故障位内部标志。

但是getline() 做了很多事情,所以很容易忽略这些细节。

【讨论】:

  • 谢谢@MichaelBurr 我现在明白逻辑了。 streamsize 参数具有缓冲区大小的默认含义。一旦达到,就不应再读取任何内容,程序员必须首先处理这种情况。
猜你喜欢
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
相关资源
最近更新 更多