在紧密循环中使用cin.get()

时间:2011-09-02 23:26:26

标签: c++ loops g++ cin

我不是编程新手,但我对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 ++中没有跨平台的休眠功能,所以这不是一个选择。我还能做些什么来完成这项工作?

2 个答案:

答案 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()返回Hello\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 >>之后,你应该忽略缓冲区中的所有字符,直到带有

的`\ n'
#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();