首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试着使用cin,peek()

试着使用cin,peek()
EN

Stack Overflow用户
提问于 2013-09-02 16:29:18
回答 2查看 1.8K关注 0票数 1

我试图从用户输入到空行,所以我写了如下:

代码语言:javascript
复制
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循环不停止?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-02 16:55:37

我们不清楚您想要做什么;直到很久之后,在完成了更多的输入之后,您才使用cin.peek()的结果,而不测试它是否成功。考虑到代码,我的第一个问题是:您了解while是如何工作的吗?修改循环中的控制变量的值不会导致您脱离循环;测试只在循环的顶部进行。在使用您输入的变量之前,必须始终验证输入是否成功。

如果您的输入是面向行的,那么经典的解决方案将是:

代码语言:javascript
复制
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的原因。

票数 2
EN

Stack Overflow用户

发布于 2013-09-02 16:35:22

代码语言:javascript
复制
cin >> check;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18577448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档