gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:18:17 24 4
gpt4 key购买 nike

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

最佳答案

可以添加

cin.ignore(1);

cin.ignore(INT_MAX, '\n');

在调用 cin.get() 之前。这将忽略用户输入第二个数字或缓冲区中直到换行符之前的所有字符留下的换行符。

此外,您既不需要将 get 的返回值与 '\n' 进行比较,也不需要将其放入循环中。用户必须按回车键才能返回 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 之前到达文件末尾。我相信这对您的程序的影响将是无限循环,但我不确定,因为我无法在 Windows 上尝试。

此外,即使您一开始不需要使用循环,您也会在 bool 上浪费更多时间,因为您可以将循环减少到

while (true)
if (cin.get() == '\n') break;

关于c++ - 在紧密循环中使用 cin.get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7290130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com