你如何“按下ENTER继续,其他任何东西退出”在C ++中

时间:2014-02-12 05:27:12

标签: c++

抱歉,我确信这个问题会被问到一百万次。我已经搜索了,我找到了“按ENTER继续”的答案,但对于我的生活,我找不到我的问题的答案。

do{
   //something something
   cout<<"Press ENTER to continue or anything else to quit."<<endl;
   //Enter is pressed or something else
}while(Enter is pressed)

这是我正在尝试将其用于

do{
   cout<<"Enter value: ";
   cin>>value[n];

   cout<<"Enter 'Y' to continue, anything else to quit"<<endl;
   cin>>reply;
}while(reply == 'y' || reply == 'Y')

代替“输入'Y'继续。还有其他东西要退出。”我只想要一个“输入继续,Q退出”。

编辑:在实施Tony D所展示的内容后,我现在已经

do{
    cout<<"Enter the person's first name, last name, and age."<<endl;
    cin>>list[n].firstName>>list[n].lastName>>list[n].age;

    n++;
    cout<<"Press ENTER to continue. 'Q' to quit. ";
    std::getline(std::cin, reply);
}while (std::getline(std::cin, reply) && reply != "Q" && reply != "q"); 

它有效,但我觉得有些事情仍然是错误的。如果我只做while (std::getline(std::cin, reply) && reply != "Q" && reply != "q"); Q或q不会退出循环,Enter只会将我带到下一行。我尝试了这个做的while while和while循环。

1 个答案:

答案 0 :(得分:3)

首先,当您像这样进行流式处理时(添加错误处理)......

if (!(cin>>list[n].firstName>>list[n].lastName>>list[n].age))
{
    std::cerr << "oops... unable to parse `firstname lastname age' from stdin... terminating\n";
    return EXIT_FAILURE;
}

... age的输入解析终止,并且不消耗后面的第一个空格字符。这意味着终止换行将始终保留在cin流中。所以,你需要做些什么来摆脱它。一个简单的方法,明确表示您对该行的其他内容不感兴趣的是:

std::cin.ignore(std::numeric_limits<streamsize>::max(), '\n');

如果您希望仔细检查所有内容,可以使用std::getline(std::cin, line)将输入行读入std::string,然后使用std::stringstream构建std::string line; if (cin>>list[n].firstName>>list[n].lastName>>list[n].age)) { std::istringstream iss(line); if (!(iss >> firstName >> lastName >> age)) { std::cerr << "oops... unable to parse `firstname lastname age' from stdin... terminating\n"; return EXIT_FAILURE; } char c; if (iss >> c) // this should fail - no more non-whitespace content allowed... { std::cerr << "oops... extra input encountered after the age value... terminating\n"; return EXIT_FAILURE; } } ,然后解析内容像这样:

do
{
    ...
} while (std::getline(std::cin, my_string) && my_string != "Q" && my_string != "q");

一旦我们确定您正在阅读整个人均输入线,对于循环终止本身来说,它可能最容易使用:

std::cin.get()

这样,任何换行符都会自动从流中删除。使用std::string line; while ((std::cout << "enter x y z (space separated): ") && std::getline(std::cin, line)) { std::istringstream iss(line); // input string stream with contents of last line read char c; if ((iss >> x >> y >> z) && !(iss >> c)) // we successfully parsed out x, y and z, and there was no trailing // non-whitespace character, so all's good... break; std::cerr << "unable to parse 'x', 'y' and 'z' from input, or unexpected trailing text\n"; std::cerr << "please try again\n"; } 从流中读取单个字符是可能且更有效的,但处理换行有点棘手。如果你想忽略领先的空白,抱怨其他非空输入等,可以变得更加漂亮。

无论你输入什么内容都可能无法到达流,直到你输入,所以他们需要按“Q”退出。为避免这种情况,您需要特定于操作系统的非标准代码或库。有很多SO问题解释如何在不等待输入的情况下读取密钥。


如果您需要容忍错误并提示用户再次尝试,最简单的方法是以无法输入的方式读取,然后在尝试解析时使用单独的流对象可能会失败。以下显示了如何从输入行解析一些变量:

iss

这样,std::cin可能由于仅仅伪造用户输入而进入不良状态,但无论如何都会使用下一行的内容重新创建。 {{1}}仅在不可恢复的问题上失败(文件结束,硬件错误等)。这样可以避免重置任何流状态,这是一件非常痛苦的事情,请参阅http://support.microsoft.com/kb/132422以获取显示方式的示例程序。