gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:15:43 26 4
gpt4 key购买 nike

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

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

如果我向 cin 提供“123456789”,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 字符,所以我不知道为什么会这样。谁能给我提示?

最佳答案

发生的事情是,如果 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() 调用只是将终止 null 放入索引 2 的数组中(即使没有从流中读取任何内容,getline() 将放置空字符 - 即使未读取是因为 failbit)。所以数组现在看起来像:

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

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

If the function stops reading because this size is reached, the failbit internal flag is set.

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

关于c++ - cin.getline 将字符串的开头设置为 '\0',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9796176/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com