62

我在 C++ 中学到的第一件事就是

#include <iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    return 0;
}

只会在没有停顿的情况下极快地出现和消失。为了防止这种情况,我不得不去记事本,并保存

helloworld.exe
pause

helloworld.bat

当我需要创建一堆小测试程序时,这变得很乏味,最终我只是把我while(true);的大多数测试程序放在最后,这样我就可以看到结果了。我可以使用更好的等待功能吗?

4

14 回答 14

75

您可以要求用户在关闭程序之前按回车键......这样的工作。

#include <iostream>
int main()
{
  std::cout << "Hello, World\n";
  std::cin.ignore();
  return 0;
}

cin 读取用户输入,cin 的 .ignore() 函数告诉程序忽略输入。一旦用户点击回车,程序将继续。

关联

于 2009-05-23T19:27:45.040 回答
57

请注意,上面的代码是
在 Windows 7 上的 Code::Blocks 12.11 和 Visual Studio 2012 上测试的。

要强制您的程序停止或等待,您有几个选择:


  • 睡眠(无符号整数)

该值必须是以毫秒为单位的正整数。这意味着如果您希望程序等待 2 秒,请输入 2000。

这是一个例子:

#include <iostream>     //for using cout
#include <stdlib.h>     //for using the function sleep

using namespace std;    //for using cout

int main(void)         
{
   cout << "test" << endl;
   sleep(5000);         //make the programme waiting for 5 seconds
   cout << "test" << endl;
   sleep(2000);         // wait for 2 seconds before closing

   return 0;
}

如果您等待太久,那可能意味着该参数以秒为单位。所以把它改成这样:

sleep(5);

对于那些在使用 sleep 时收到错误消息或问题的人,请尝试将其替换为 _sleep 或 Sleep,尤其是在 Code::Bloks 上。
如果您仍然遇到问题,请尝试在代码开头添加一个此库。

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <dos.h>
#include <windows.h>

  • 系统(“暂停”)

Windows 控制台应用程序上的一个简单的“Hello world”程序可能会在您看到任何内容之前关闭。可以使用 system("Pause") 的情况。

#include <iostream>    

using namespace std;   

int main(void)         
{
    cout << "Hello world!" << endl;

    system("PAUSE");

    return 0;
}

如果您收到消息“错误:'system' 未在此范围内声明”,只需在代码的 biggining 处添加以下行:

#include <cstdlib>

  • cin.ignore()

使用 cin.ignore() 可以达到相同的结果:

#include <iostream>     

using namespace std;    

int main(void)         
{
    cout << "Hello world!" << endl;

    cin.ignore();

    return 0;
}

  • cin.get()

例子 :

#include <iostream>     

using namespace std;    

int main(void)         
{
    cout << "Hello world!" << endl;

    cin.get();

    return 0;
}

  • getch()

只是不要忘记添加库 conio.h :

#include <iostream>     
#include <conio.h>    //for using the function getch()

using namespace std;    

int main(void)
{

    cout << "Hello world!" << endl;

    getch();

    return 0;
}

你可以有消息告诉你使用 _getch() insted of getch

于 2013-02-20T19:58:18.770 回答
55

很多人建议使用 POSIX sleep、 Windows Sleep、 Windows system("pause")、 C++ cin.get()……甚至还有一个 DOS getch(),大约从 1920 年代后期开始。

不要做这些。

在我的团队中,这些解决方案都无法通过代码审查。这意味着,如果您提交此代码以包含在我们的产品中,您的提交将被阻止,您将被告知去寻找另一个解决方案。(有人可能会争辩说,当你只是一个业余爱好者时,事情并没有那么严重,但我建议在你的宠物项目中养成良好的习惯,这将使你成为商业组织中有价值的专业人士,并让你被录用。 )

保持控制台窗口打开以便您可以阅读程序的输出不是您的程序的责任!当您在程序末尾添加等待/睡眠/阻塞时,您违反了单一职责原则,造成大量抽象泄漏,并消除了程序的可重用性/可链接性。它不再接受输入并提供输出——它出于临时使用原因而阻塞。这是非常不好的。

相反,您应该配置您的环境以在程序完成其工作后保持提示打开。您的批处理脚本包装器是一个好方法!我可以看到必须继续手动更新是多么烦人,而且你不能从你的 IDE 中调用它。您可以使脚本将要执行的程序的路径作为参数,并配置您的 IDE 以调用它而不是直接调用您的程序。

一种临时的快速启动方法是将IDE 的运行命令cmd.exe <myprogram>or更改<myprogram>cmd.exe /K <myprogram>. 在给定路径的程序终止后,/K切换到cmd.exe 使提示保持打开状态。这将比您的批处理脚本解决方案更烦人,因为现在您必须exit在阅读完程序输出后键入或单击红色的“X”,而不仅仅是敲击空格键。


我假设使用 IDE,否则您已经从命令提示符调用,这首先不是问题。此外,我假设使用 Windows(基于问题中给出的细节),但这个答案适用于任何平台......顺便说一句,这是一半。

于 2016-04-02T14:37:24.383 回答
24

用于显示文本的窗口的出现和消失是程序运行方式的特征,而不是 C++ 的特征。

在持久的命令行环境中运行,或者程序中包含窗口支持,或者使用sleep或等待输入,如其他答案所示。

于 2009-05-23T20:35:24.263 回答
13

相当于批处理程序将是

#include<iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    std::cin.get();
    return 0;
}

附加行的作用完全PAUSE一样,等待单个字符输入

于 2009-05-23T19:27:49.627 回答
12

有一种 C++11 方法可以做到这一点。它非常简单,我相信它是便携的。当然,正如Orbit 中的 Lightness Races指出的那样,您不应该为了能够在终端中看到Hello World而这样做,但是使用等待功能存在一些充分的理由。无需再费周折,

#include <chrono> // std::chrono::microseconds
#include <thread> // std::this_thread::sleep_for
std::this_thread::sleep_for(std::chrono::microseconds{});

更多详细信息可在此处获得。另请参阅sleep_until

于 2017-02-04T21:37:23.357 回答
7

实际上,与其他答案相反,我相信 OP 的解决方案是最优雅的解决方案。

这是您通过使用外部.bat包装器获得的收益:

  1. 该应用程序显然在等待用户输入,因此它已经完成了您想要的操作。
  2. 您不会因为尴尬的调用而使代码混乱。谁该等?main()?
  3. 您不需要处理跨平台问题 - 看看system("pause")这里有多少人建议。
  4. 如果没有这个,要在黑盒测试模型中以自动方式测试您的可执行文件,您需要模拟enter按键(除非您执行脚注中提到的操作)。
  5. 也许最重要的是 - 如果任何用户想要通过终端(cmd.exe在 Windows 平台上)运行您的应用程序,他们不想等待,因为他们无论如何都会看到输出。使用.bat包装器技术,他们可以决定是运行.bat(或.sh)包装器,还是直接运行可执行文件。

专注于最后两点 - 使用任何其他技术,我希望程序至少提供--no-wait开关,以便我作为用户可以使用应用程序进行各种操作,例如管道输出,将其与其他程序等。这些是正常 CLI 工作流程的一部分,当您已经在终端中时,在最后添加等待只会妨碍用户体验并破坏用户体验。

由于这些原因,IMO.bat解决方案在这里是最好的。

于 2015-10-17T11:14:30.373 回答
4

你所拥有的可以写得更容易。代替:

#include<iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    return 0;
}

#include<iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    system("PAUSE");
    return 0;
}

系统函数执行你给它的任何东西,就好像它是在命令提示符下写的一样。它会在命令执行时暂停程序的执行,因此您可以对它进行任何操作,甚至可以从您的 cpp 程序编译程序。

于 2009-05-24T02:04:19.500 回答
2

句法:

无效睡眠(无符号秒);

sleep() 暂停执行一段时间(秒)。调用 sleep 后,当前程序将暂停执行由参数 seconds 指定的秒数。间隔仅精确到最接近的百分之一秒或操作系统时钟的精确度,以较不精确的为准。

这个例子应该清楚地表明:

#include <dos.h>
#include <stdio.h>
#include <conio.h>

int main()
{
   printf("Message 1\n");
   sleep(2); //Parameter in sleep is in seconds
   printf("Message 2 a two seconds after Message 1");
   return 0;
}

记住你必须#include dos.h

编辑:

您也可以使用 winAPI。

VOID WINAPI Sleep(
DWORD dwMilliseconds
);

睡眠功能(Windows)

请注意,winapi提供的函数中的参数是以毫秒为单位的,所以上面代码片段中的sleep行看起来像这样“Sleep(2000);”

于 2009-05-23T19:28:09.610 回答
-1

getchar() 提供了一个简单的答案(等待键盘输入)。退出前调用 Sleep(milliseconds) 休眠。 睡眠功能 (MSDN)

于 2009-05-23T19:28:51.060 回答
-2

您可以使用 sleep() 或 usleep()。

// Wait 5 seconds
sleep( 5 );
于 2009-05-23T19:27:11.140 回答
-2

好吧,这是一篇旧帖子,但我只会为这个问题做出贡献——稍后有人可能会发现它很有用:

添加 'cin.get();' 在 main() 返回之前的函数似乎总是在打印结果之前阻止程序退出:请参见下面的示例代码:

int main(){ 字符串 fname, lname;

  //ask user to enter name first and last name
  cout << "Please enter your first name: ";
  cin >> fname;

  cout << "Please enter your last name: ";
  cin >> lname;     
  cout << "\n\n\n\nyour first name is: " << fname << "\nyour last name is: " 
  << lname <<endl;

  //stop program from exiting before printing results on the screen
  cin.get();
  return 0;

}

于 2011-01-09T17:53:04.910 回答
-2

在 main 中的 return 语句之前,插入以下代码:

系统(“暂停”);

这将保持控制台,直到您按下一个键。

#include<iostream>
#include<string>

using namespace std;

int main()
{
    string s;
    cout << "Please enter your first name followed by a newline\n";
    cin >> s;
    cout << "Hello, " << s << '\n';
    system("pause");
    return 0; // this return statement isn't necessary
}
于 2013-02-10T09:03:30.607 回答
-3

要学习的第二件事(有人会争辩说这应该是第一件事)是操作系统的命令行界面以及编译器/链接器标志和开关。

于 2009-05-23T19:47:00.227 回答