gpt4 book ai didi

c++ - 为什么 cin 在使用 getline 后没有获取缓冲区数据?

转载 作者:行者123 更新时间:2023-12-01 14:36:32 25 4
gpt4 key购买 nike

到此代码:

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>

using namespace std;

#define p(a) cout << "|" << a << "|" << endl
int main() {

char a[100];
char b[100];

cin.getline(a, 4, '\n');

cin >> b;

p(a);
p(b);

return 0;
}

如果我的输入是“1234”

1234

我有下一个输出:

|123|
||

但我知道使用 getline,我得到了三个元素:"123" 并且它发送到 a 变量添加到 \0 字符。同理,剩余字符"4\n"留在缓冲区。那么为什么在接下来的"cin>>"中没有复制到b变量中,为什么bnull?

最佳答案

如果std::istream::getline无法将整行(并以 null 结尾)放入给定缓冲区,它会设置一个错误标志并变得不可读,直到错误被清除。

std::istream::get对于此用例,第四个重载是更好的选择,因为如果整行未被消耗,它不会引发标志。

替换

cin.getline(a, 4, '\n');

cin.get(a, 4, '\n');

无关推荐:

在任何 IO 事务之后,在继续之前测试流的状态,以便您知道是否值得按计划进行,或者事务是否失败并且您必须执行其他操作(例如 clear错误并重试)。例如,您可以

if (cin)
{
// safe to act upon the values read
}

或者,因为几乎所有的流函数都返回流以便于 IO 链接,

if (cin.get(a, 4, '\n'))
{
// safe to act upon the values read
}

既然我提到了它,链接就是让代码像这样的魔法

std::cin >> a >> b >> c;

并通过测试成功读取 abc

if (std::cin >> a >> b >> c)
{
// safe to do stuff with a, b, and c
}

关于c++ - 为什么 cin 在使用 getline 后没有获取缓冲区数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63496250/

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