我试图从用户输入到空行,所以我写了如下:
while (c != '\n')
{
c = cin.peek();
cin >> check;
if (check == "Test")
{
cin >> ID >> One >> Two >> Three;
Test[i++] = Test(ID, One, Two, Three);
}
} 例如,我现在从user Test 12 45 56 78 99,check=test,id=45,one,56,two=78,three=99,当我输入空行时,为什么when循环不停止?
发布于 2013-09-02 16:55:37
我们不清楚您想要做什么;直到很久之后,在完成了更多的输入之后,您才使用cin.peek()的结果,而不测试它是否成功。考虑到代码,我的第一个问题是:您了解while是如何工作的吗?修改循环中的控制变量的值不会导致您脱离循环;测试只在循环的顶部进行。在使用您输入的变量之前,必须始终验证输入是否成功。
如果您的输入是面向行的,那么经典的解决方案将是:
std::string line;
while ( std::getline( std::cin, line ) && !isEmpty( line ) ) {
std::istringstream parser( line );
if ( parser >> check >> ID >> One >> Two >> Three >> std::ws
&& parser.get() == EOF ) {
// Data is good, can be used...
} else {
// Some sort of format error in the line...
}
}我已经将空行的测试放在一个单独的函数中,因为您可能希望将带空白的行视为空行。(用户在进入前可能不小心碰到空格键,他们看到的仍然是空行。)这也是为什么我在检查解析时行尾没有垃圾之前,将>>转换为std::ws的原因。
发布于 2013-09-02 16:35:22
cin >> check;是一个格式化的输入函数,意味着它将丢弃前导空格。空白行只是前导空格,它将被丢弃,提取操作符将继续读取,直到非空白数据到达,或发生I/O错误。
https://stackoverflow.com/questions/18577448
复制相似问题