【问题标题】:How do I get my program to wait for keyboard input?如何让我的程序等待键盘输入?
【发布时间】:2012-08-21 05:18:19
【问题描述】:

好吧,当我遇到以前从未遇到过的问题时,我只是在做一点练习。

#include <iostream>

using namespace std;

int main()
{
string empname = "";
int empage = 0;
char yes = 'y';

cout << "Please enter employee name:" << endl;
cin >> empname;
cin.get();
cout << "Your name is " + empname + " is this correct? (yes/no):" << endl;

if (yes)
{
    cout << "good" << endl;
}
else
{
    cout << "Please try again" << endl;
}

cout << "Please enter employee age:" << endl;
cin >> empage;
cin.get();
cout << "Your age is " + empname + " is this correct? (yes/no):" << endl;
if (yes)
{
    cout << "good" << endl;
}
else
{
    cout << "Please try again" << endl;
}
}

这作为控制台程序执行,但在第 11 行 [包括空格] (cout

【问题讨论】:

  • 如果char yes = 'y';,那么yes 总是true。我认为这部分尚未实施。
  • 它看起来不错,在 gcc 4.6.3 上运行良好。您确定要显示您尝试运行的代码吗?
  • 你能在cin之后试试fflush(stdin) >> empname;行。
  • @BharatSharma:fflush(stdin)未定义的行为。见:stackoverflow.com/questions/2979209/using-fflushstdin
  • @GregHewgill 谢谢我认为你已经给出了正确的答案。实际上,我在大学时就使用过它,并且在该编译器上运行良好。但我知道我们需要清除输入缓冲区。

标签: c++ input keyboard


【解决方案1】:

我假设这个“按 ENTER 继续”部分来自您的环境(批处理脚本、编辑器等),因为它不在您的代码中。

问题在于 cin(通常是 istream)用所有空格分隔输入,而不仅仅是换行符。所以cin &gt;&gt; empname实际上只存储了员工姓名直到第一个空格的部分,即名字。 cin.get() 只获取一个字符,因此它不会等待换行符出现。

您应该使用std::getline(在 中)来获取整行输入。

例子:

string empname = "";
cout << "Please enter employee name:" << endl;
getline(cin, empname);

【讨论】:

  • 但是 getline() 是外部头文件的一部分吗?因为当我编译时出现错误:没有匹配函数调用 'std::basic_istream::getline()'
  • 有两个getline函数。 std::getline 中;它产生一个字符串对象(这可能是你想要的)。 istream::getline 中;它将数据读入 C 字符串。我已经澄清了我的答案。
  • 我如何让它在 而不是 中查找
  • 我之前的回答推荐了 cin.getline,它读入一个 C 字符串。我已将其更改为推荐 中的 getline 函数,这可能是您想要的。还添加了一个例子,让用法更清楚。
【解决方案2】:

您同时使用 cin 和 cin.get()。正如 nnoneo 正确指出的那样,最好在此处使用 getline。 除此之外,让我告诉您,每当您背靠背使用格式化和未格式化的输入时,都会出现这种错误(请记住 cin 已格式化,而 cin.get 和 getline 未格式化)。这是因为格式化输入会从流中删除空格或结束符。该字符保留在流中,下次当您尝试未格式化的输入时,该字符将进入流并进入您的变量。

为避免此字符进入其中,您可以在格式化和未格式化输入之间使用 cin.clear () 或 cin.ingore()。 希望有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多