繁体   English   中英

while循环中的C ++ cout打印两次

[英]C++ cout in while loop prints twice

我修改了Bjarne Stroustrup编程:C ++中的原理和实践中的代码,试图检查给定的输入是否有效:

#include <iostream>
using namespace std;

int main()
{
    cout << "Please enter your first name and age: ";
    string first_name = "???";
    int age = -1;
    cin >> first_name >> age;

    while (!cin) {
        cin.clear();
        cout << "Sorry, can you enter that again? ";
        cin >> first_name >> age;
    }

    cout << "Hello, "<<first_name<<"! (age "<<age<<")\n";
    return 0;
}  

这可以按预期工作,除了"Sorry, can you enter that again? "这两个字样被打印两次,一次是在第二次输入之前,一次是之后。

任何人都知道为什么会发生这种情况? 谢谢。

清除失败位是不够的,还必须清除输入缓冲区中的任何剩余字符。 此外,代码看起来比必要的更复杂。 以下作品:

std::string name;
int age;

std::cout << "Please enter your name & age: ";

while (not (std::cin >> name >> age)) {
    std::cout << "Sorry, can you enter that again? ";
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

std::cout << "Hello " << name << " (" << age << ")\n";

哦,是的,不要忘记刷新输出流,我不认为这将自动为您完成。

也就是说,标准输入/输出流就是 ,所以它们实际上并不适合交互式输入。 您应该使用适当的库,例如readlinencurses

为了说明为什么这很重要,想象用户输入“ foo42 ”并按回车键。 你希望程序现在说“对不起,你能再次输入吗?”但事实并非如此。 相反,它温顺地等待用户输入第二个令牌。 从可用性的角度来看,这肯定不是你所期望的。

这取决于你输入的内容!

  • 输入"Tim 29" :作品,“你好蒂姆(29)”。

  • 输入"Tim Tom 29" :作品,一次重复,“你好汤姆(29)”。

  • 输入"Tim Tom Tina 29" :作品,两次重复,“你好蒂娜(29)”。

我假设你正在尝试第三个。 第一个失败是Tom ,他不是一个数字。 重置错误状态很好,但它没有摆脱Tom 我们仍然需要再次失败的尝试才能消耗他( Tina失败了,那时他不是一个数字)。 只有这样,我们才准备好Tina

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM