1

I try to get from the user inputs till blank line so I wrote this:

while (c != '\n')
{
    c = cin.peek();
    cin >> check;
    if (check == "Test") 
    {
        cin >> ID >> One >> Two >> Three;
        Test[i++] = Test(ID, One, Two, Three);
    }
}     

to example, I get from the user Test 12 45 56 78 99 now, check=test, id=45, one, 56, two=78, three=99 and when I enter empty line, why the while loop isn't stopped?

4

2 回答 2

2

目前尚不清楚您要做什么;直到很久以后,在完成更多输入之后,您才使用结果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-02T16:55:37.770 回答
1
cin >> check;

是一个格式化的输入函数,这意味着它将丢弃前导空格。空行只是前导空白,它将被丢弃,提取运算符将继续读取,直到非空白数据到达或发生 I/O 错误。

于 2013-09-02T16:35:22.380 回答