问题描述
此代码:
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>>"
变量中呢?为什么b
是b
?
解决方法
如果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;
,并通过测试成功读取a
,b
和c
if (std::cin >> a >> b >> c)
{
// safe to do stuff with a,b,and c
}