为什么 cin.getline() 在读取我的输入并将其分配给 char 数组时不读取最后一个字符?

Why does cin.getline() not read the last character when it reads my input and assigns it to a char array?

提问人:Alex 提问时间:11/18/2023 最后编辑:Remy LebeauAlex 更新时间:11/18/2023 访问量:47

问:

我是 C++ 的新手。我不明白为什么我用来为字符数组分配字符的 它没有返回“正确”的字符数。cin.getline()

例如,我有:

char st[5];
cin.getline(st,5);
cout<<st;

我的理解是从我的键盘上读取 5 个字符并将它们分配给 .因此,假设我运行上面的代码块并输入 .我现在希望持有,但它只持有。最后一个字符 , 被截断。为什么会这样?getline(st, 5)st"abcde"st"abcde""abcd"e

C++ 数组 cin getline

评论

0赞 Some programmer dude 11/18/2023
请记住,大小应包含字符串 null-terminator。请改用 and 来获取任意长的字符串。或者至少不要贪婪数组大小。std::stringstd::getline
0赞 user4581301 11/18/2023
在这 5 个字符中,您需要能够适应字符串的终止 null,因此您能做的最好的事情就是 4 个字符。
0赞 JaMiT 11/18/2023
这回答了你的问题吗?getline 跳过 char 数组的一个字符或 istream::getline() 没有得到最后一个字符?
0赞 JaMiT 11/18/2023
有用的参考:cppreference.com(有一系列原因可以停止阅读。第 3 点:“计数 - 已提取 1 个字符”。

答:

1赞 Remy Lebeau 11/18/2023 #1

我的理解是从我的键盘上读取 5 个字符并将它们分配给 .getline(st, 5)st

这是不正确的。它最多可以读取和存储 4 个字符,然后存储一个 null 终止符。正如缓冲区本身必须为终结器留出空间一样,传入的大小也必须考虑终结器。

最后一个字符 , 被截断。e

它不是“切断”的。它根本没有被阅读。它仍然位于 的输入缓冲区中,等待后续的读取操作来提取它。cin