抱歉,我确信这个问题会被问到一百万次。我已经搜索了,我找到了“按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循环。
答案 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以获取显示方式的示例程序。