在C ++中是否有一个像样的等待函数?

时间:2009-05-23 19:23:52

标签: c++ wait

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

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

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

helloworld.exe
pause

helloworld.bat

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

14 个答案:

答案 0 :(得分:60)

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

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

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

Link

答案 1 :(得分:44)

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

为了强制您的程序停止或等待,您有以下几种选择:


  • sleep(unsigned int)

该值必须是以毫秒为单位的正整数。 这意味着如果您希望程序等待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”程序可能会在您看到任何内容之前关闭。那种你可以使用系统的情况(“暂停”)。

#include <iostream>    

using namespace std;   

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

    system("PAUSE");

    return 0;
}

如果收到消息“错误:'系统'未在此范围内声明”,只需添加即可 在代码的大角度中的以下行:

#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;
}

您可以让消息告诉您使用getget

的_getch()

答案 2 :(得分:44)

有很多人建议POSIX sleep,Windows Sleep,Windows system("pause"),C ++ cin.get() ......甚至还有DOS getch()从大致20世纪20年代后期开始。

不要做其中任何一项。

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

保持控制台窗口打开以便您可以阅读程序的输出您的程序的责任!当您在程序结束时添加wait / sleep / block时,您违反了单一责任原则,造成了大量的抽象泄漏,并且删除了程序的可重用性/可链接性。它不再需要输入并提供输出 - 它会因瞬态使用原因而阻塞。这非常不好。

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

临时快速启动方法是将您的IDE的运行命令cmd.exe <myprogram><myprogram>更改为cmd.exe /K <myprogram>/K切换到cmd.exe 会在指定路径的程序终止后使提示保持打开状态。这比批处理脚本解决方案稍微麻烦一点,因为现在您必须键入exit或点击红色&#39; X&#39;当你完成阅读节目的输出时,而不仅仅是打空格键。

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

答案 3 :(得分:20)

用于显示文本的窗口的出现和消失是您运行程序的一个特性,而不是C ++。

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

答案 4 :(得分:12)

与批处理程序相当的是

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

附加行与PAUSE完全相同,等待单个字符输入

答案 5 :(得分:7)

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

以下是使用外部.bat包装器获得的内容:

  1. 应用程序显然等待用户输入,因此它已经完成了你想要的工作。
  2. 您不会通过尴尬的电话混乱代码。谁应该等? main()
  3. 您不需要处理跨平台问题 - 请参阅此处有多少人建议system("pause")
  4. 如果没有这个,要在黑盒测试模型中以自动方式测试您的可执行文件,您需要模拟enter按键(除非您执行脚注中提到的操作)。
  5. 也许最重要的是 - 如果任何用户希望通过终端(Windows平台上的cmd.exe)运行您的应用程序,他们想要等待,因为他们&#39;无论如何都会看到输出。使用.bat包装器技术,他们可以决定是运行.bat(或.sh)包装器,还是直接运行可执行文件。
  6. 关注最后两点 - 使用任何其他技术,我希望程序至少提供--no-wait切换,以便我作为用户可以使用应用程序进行各种操作例如管道输出,将其与其他程序链接等。这些是正常CLI工作流程的一部分,当你已经在终端内部时加入等待只会妨碍用户体验。

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

答案 6 :(得分:5)

有一种C ++ 11的方法。这很简单,我相信它是便携式的。当然,正如Lightness Races in Orbit指出的那样,为了能够在终端中看到 Hello World ,你不应该这样做,但是有一些很好的理由使用等待函数。不用多说,

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

有更多详细信息here。另请参阅sleep_until

答案 7 :(得分:3)

您所拥有的内容可以更轻松地编写。 而不是:

#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程序编译程序。

答案 8 :(得分: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
);

Sleep Function(Windows)

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

答案 9 :(得分:-1)

getchar()提供了一个简单的答案(等待键盘输入)。 退出前调用Sleep(毫秒)进入睡眠状态。 Sleep function (MSDN)

答案 10 :(得分:-2)

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

// Wait 5 seconds
sleep( 5 );

答案 11 :(得分:-2)

嗯,这是一篇很老的帖子,但我只会对这个问题做出贡献 - 有人可能会发现它有用:

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

int main(){       string 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;

}

答案 12 :(得分:-2)

在您的main语句中返回语句之前,请插入以下代码:

系统( “暂停”);

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

#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
}

答案 13 :(得分:-3)

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