C++ “你怎么看?”;按ENTER键继续,其他任何键退出;在C++;
对不起,我肯定这个问题被问了一百万次。我已经搜索过了,我找到了“按回车键继续”的答案,但就我而言,我找不到我问题的答案C++ “你怎么看?”;按ENTER键继续,其他任何键退出;在C++;,c++,C++,对不起,我肯定这个问题被问了一百万次。我已经搜索过了,我找到了“按回车键继续”的答案,但就我而言,我找不到我问题的答案 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
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首先,当您这样做流媒体时(添加错误处理)
如果您希望仔细检查所有内容,可以使用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;
}
}
这样,任何换行符都将自动从流中删除。使用std::cin.get()
从流中读取单个字符是可能的,而且效率更高,但是处理换行符有点麻烦。如果您想忽略前导空格,抱怨其他非空输入等,则可能会变得更花哨
在按enter键之前,您键入的任何内容都可能无法到达流,因此他们需要按“Q”键退出。为了避免这种情况,您需要操作系统特定的非标准代码或库。有很多so问题解释了如何在不等待enter键的情况下读取密钥
如果您需要容忍错误并提示用户重试,最简单的方法是以不会因无效输入而失败的方式读取,然后在尝试解析可能失败的数据时使用单独的流对象。以下显示了如何解析输入行中的几个变量:
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";
}
std::字符串行;
而((标准::cout>x>>y>>z)和&!(iss>>c))
//我们成功地解析出了x、y和z,并且没有拖尾
//非空白字符,所以一切都很好。。。
打破
如果您的问题只是关于更改输入循环,那么不应该有那么多不相关的代码。编辑:)抱歉,我是新来的。我希望按ENTER键,循环继续。Q,然后回车,循环退出。cin.get()做什么?“要按ENTER键,循环继续。Q,然后回车,循环退出”-这就是我答案中的代码所做的。“cin.get()做什么?”-它从流中读取下一个字符,因此您可以与“\n”进行比较,以查看在“Q”或“Q”之前是否按了enter键,但如果有人连接来自另一个操作系统的输入,则可能会有一个回车符挂在后面,由您的下一个cin>>值[n]看到;
-对于您的情况,如果您将流保留为跳过空白的默认行为,那么这可能无关紧要。谢谢。我添加了std::getline(std::cin,reply);在循环中,它会运行。这是我应该做的,还是我在做额外的步骤并遗漏了什么?听起来你可能遗漏了什么,尽管我不能确定你是否没有看到更新的代码;getline
可以在循环结束时的while()
条件中调用,而不是“在循环中”,这使得测试getline
本身是否成功以及测试行内容本身是否包含“Q”变得非常简单。只需将我的答案中的整个while(…)
子句复制/粘贴到代码中,并在循环之前放置一个std::string my_string;
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;
}
std::cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
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::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";
}