我不是编程新手,但我对C ++比较陌生。我想分发简单的控制台应用程序,以便在我学习时可以帮助其他人。我大学校园里的绝大多数机器都是基于Windows的,默认情况下安装了Borland编译器。我更喜欢使用g ++和其他工具在基于Linux的系统上进行开发。所以我想添加一些让平台保持运行的跨平台方式,直到用户按下回车键。这样,即使用户双击exe而不是在Windows控制台中运行它,用户也能够查看输出。为此,我写了类似的东西:
#include <iostream>
using namespace std;
int main()
{
float val1, val2;
bool wait = true;
cout << "Please enter the first value to add: ";
cin >> val1;
cout << "Please enter the second value to add: ";
cin >> val2;
cout << "Result: " << val1 + val2 << endl << endl;
cout << "Press enter to exit...";
while (wait)
{
if (cin.get() == '\n')
wait = false;
}
return 0;
}
使用上面的代码,程序在显示结果后退出。但是,如果你注释掉cin调用,它会按预期工作。这让我相信cin.getline正在从我上一次数据输入中获取我的回车键。我怀疑这是由于循环的紧张。我了解到C ++中没有跨平台的休眠功能,所以这不是一个选择。我还能做些什么来完成这项工作?
答案 0 :(得分:4)
您可以添加
cin.ignore(1);
或
cin.ignore(INT_MAX, '\n');
在致电cin.get()
之前。这将忽略用户输入第二个数字或缓冲区中所有字符的新行,直到换行。
此外,您既不需要将get
的返回值与'\n'
进行比较,也不需要将其置于循环中。用户必须按Enter键才能返回get
,所以
cout << "Press enter to exit...";
cin.ignore(INT_MAX, '\n');
cin.get();
足够了。
如果你这样做会怎样?
cout << "Press enter to exit...";
while (wait)
{
if (cin.get() == '\n')
wait = false;
}
是否输入循环,并调用cin.get()
。用户可以根据需要在控制台输入任意数量的文本。说他们进入了
Hello
在控制台中。然后用户按下Enter键。 cin.get()
返回H
,ello\n
仍留在缓冲区中。您将H
与\n
进行比较并发现它们不相等,继续循环。调用cin.get()
,因为缓冲区中已有文本,所以立即返回e
。这个循环继续浪费时间,直到它到达缓冲区的最后一个字符\n
,并且它与\n
进行比较,因此循环中断。如你所见,这是浪费时间。
如果您确实将cin.get()
置于循环中并将其返回值与\n
进行比较,那么cin
之前还存在\n
到达文件末尾的危险遇到bool
。我相信这对你的程序的影响将是一个无限循环,但我不确定,因为我不能在Windows上尝试。
此外,即使你不需要首先使用循环,你也会浪费更多的时间来使用while (true)
if (cin.get() == '\n') break;
,因为你可以将循环减少到
{{1}}
答案 1 :(得分:0)
在cin >>
之后,你应该忽略缓冲区中的所有字符,直到带有
#include <limits> // for std::numeric_limits as indicated by Marlon
std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
然后你可以等待下一行:
cout << "Press enter to exit...";
cin.get();