C ++ cout在do while循环中打印两次

时间:2012-08-14 14:52:48

标签: c++

系统做到了这一点:

请输入用户的全名:请输入用户的全名:

它输出字符串“请输入用户的全名:”两次,如何更改代码使其只是cout一次

string fullname = "";

    do
    {
    cout << "Please input the Full Name of the user: ";
    getline (cin,fullname);
    }while(fullname.length()<1);

C ++导致系统输出两次的原因

4 个答案:

答案 0 :(得分:3)

您可以尝试刷新输入流以摆脱剩余的换行符: std::cin.ignore(x);x是要忽略的字符数,例如INT_MAX)。

答案 1 :(得分:2)

您正在执行输入操作而不检查结果,这是一个难以编程和理解的错误。这样做:

for (std::string line; ; )
{
    std::cout << "Name: ";
    if (!std::getline(std::cin, line) || !line.empty()) { break; }
}

第一个条件检查输入是否成功(输入流关闭时为false),第二个条件检查读取行是否为非空。 ||的短路语义使第二次检查合法化。

答案 2 :(得分:2)

简单的解决方案是将std :: cout语句移到do-while循环之外。

string fullname = "";
cout << "Please input the Full Name of the user: ";
do
{ 
    getline (cin,fullname);
}while(fullname.length()<1);

答案 3 :(得分:0)

正如其他人指出的那样,问题是输入流上有一个额外的'\ n'字符。

与流行的答案相反,我不认为刷新(ignore())当前输入是一个很好的解决方案。你正在治疗症状而不是问题。如果您正在使用ignore(),则可能会丢弃您可能实际需要的用户输入或可能检测到用户错误的内容:

> Input Your age
> 36xxxx

// If you use
std::cin >> age;
// Then sometime later in your code you use
// ignore to make sure that you have "correctly" skipped to the next new line
std::ignore(std::numeric_limits<std::streamsize>::max(), '\n');

// You have now just ignored the fact that the user typed xxx on the end of the input.
// They were probably doing that to force an error in the code or something else erroneous
// happened but you just missed it with std::ignore()

最好的解决办法是不要陷入这种情况 使用operator<<()std::getline()的组合来解析用户输入会导致此问题。我喜欢使用operator<<()来解析正常或常规输入;但手动用户输入(即问题/答案)更难以预测,用户输入为line based(输入以'\ n'字符结束,因为缓冲区在点击&lt; enter&gt;时被刷新。)

因此,当我解析manual user input时,我总是使用std :: getline()。这样我知道我得到了他们的全部答案。它还允许我验证输入以确保没有输入错误。

 std::cout << "What is your age\n";

 std::string        line;
 std::getline(std::cin, line);   // Get user input

 // Use stream for easy parsing.
 std::stringstream  linestream(line);

 // Get value we want.
 linestream >> age;

 // Validate that we have not thrown away user input.
 std::string error;
 linestream >> error;
 if (error.length() != 0) { /* do stuff to force user to re-input value */ }