【问题标题】:Alternative to system("Pause"); revisited替代系统(“暂停”);重访
【发布时间】:2013-12-27 12:25:18
【问题描述】:

我知道这个问题已被问过一百万次,但我有一个编码问题,因为有几个替代方案似乎不适用于此代码,我不知道为什么。如果您在 return 0; 之前查看,我正在尝试 cin.get() 并且它不会停止程序,而且我在其他程序上工作的某个地方找到的 PressEnterToContinue() 函数也不会停止。我唯一需要处理的是系统暂停,我不想使用它,因为我也将使用这个跨平台。有什么想法吗?

#include <iostream>

using namespace std;

void PressEnterToContinue()
{

std::cout << "Press ENTER to continue... " << std::flush;
std::cin.ignore(std::numeric_limits <std::streamsize> ::max(), '\n');

}

int main(void)
{
int pause;
double distance, x1, y1, x2, y2, x, y;

cout << "This program outputs the distance between two points on a plane!" << endl;
cout << "Please input point X1" << endl;
cin >> x1;
cout << "Please input point Y1" << endl;
cin >> y1;
cout << "Please input point X2" << endl;
cin >> x2;
cout << "Please input point Y2" << endl;
cin >> y2;

x = x2 - x1;
y = y2 - y1;


distance = sqrt(x*x + y*y);


cout << distance << endl;

//cin.get();
    //PressEnterToContinue();
    //system("Pause");
return 0;

}

请随意提及我在这里没有的停止系统的方法。谢谢,

【问题讨论】:

    标签: c++ system output


    【解决方案1】:

    这是因为您的最后一个输入 (cin &gt;&gt; y2) 将换行符留在了输入缓冲区中。然后通过调用cin.get()PressEnterToContinue() 来读取。

    PressEnterToContinue 函数中,您可能希望先在输入缓冲区处"peek" 看看是否有任何字符,如果有则执行额外的cin.ignore


    当你这样做时,例如

    cin >> y2;
    

    然后你输入输入

    123\n
    

    然后输入缓冲区将包含字符串"123\n"。输入运算符提取数字(123)后,输入缓冲区将包含"\n",即cin.get()调用读取的内容。

    【讨论】:

    • 我不确定我理解为什么 cin >> y2 在输入缓冲区中留下一个换行符,你能(或其他阅读本文的人解释一下吗?)
    • @Slimmons 更新了我的答案
    • 好的,所以我可以使用带有 PressEnterToContinue 函数的 peek 方法,或者,如果我知道缓冲区中将有一个返回字符,我也可以在之前执行一个 cin.ignore()我 cin.get() 正确吗?
    • @Slimmons 是的,两者都可以。
    【解决方案2】:

    要解决这个问题,您只需刷新缓冲区。示例中的数字10000 只是要从缓冲区中清除的字符数。

    cin.ignore(10000);
    cin.get();

    要回答为什么cin &gt;&gt; y2 在缓冲区中留下换行符是因为您通过按回车键输入了换行符,并且通过将控制台中的数据检索到您的变量中,您留下了换行符。

    【讨论】:

    • 为什么是 10000 ?我喜欢这种方式std::cin.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');
    • 我只是选择了 10000 作为任意数字.. 虽然我同意,但在我的代码中,每当我使用 cin.ignore() 时,我都会使用最大数字 :)
    【解决方案3】:

    技术问题:字符(有时只是换行符)留在输入缓冲区中。

    也就是说,程序永远不需要在最后自行停止,因此system( "pause" ) 或任何停止操作没有优势,还有一些问题,包括可移植性。

    从命令行运行您的程序。

    或者,由于您是在 Windows 中编程,请使用 Visual Studio 并通过 Ctrl F5 运行程序。

    或者,在main 的最后一个右大括号上放置一个断点并通过调试器运行程序,例如按 F5 在 Visual Studio 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      相关资源
      最近更新 更多