微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在使用getline之后cin无法获得缓冲区数据?

如何解决为什么在使用getline之后cin无法获得缓冲区数据?

代码

regex

如果我输入的是“ 1234”

#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

但是我知道使用getline可以得到三个元素:|123| || ,它将发送到"123"变量,最后添加a字符。同样,其余字符\0留在缓冲区中。那么为什么在下一个"4\n"中没有将其复制到"cin>>"变量中呢?为什么bb

解决方法

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

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

替换

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

使用

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

不相关的建议:

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

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

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

if (cin.get(a,'\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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。