【问题标题】:Why does my program's output flash and close in Windows?为什么我的程序输出在 Windows 中闪烁并关闭?
【发布时间】:2010-11-06 03:29:40
【问题描述】:

我正在尝试为 K&R“Hello, world”构建一个 .exe 文件。书中给出的代码是:

#include <stdio.h>  
main()  
{  
    printf("Hello, world!\n");  
}  

当我从 Code::Blocks(在 Windows XP 下)构建和运行时,我会看到带有“hello world”消息的提示窗口。它保持打开状态,直到我手动关闭它。但是,我双击.exe文件时,提示只是闪烁并消失,这是为什么?

【问题讨论】:

标签: c windows console


【解决方案1】:

当像这样从 IDE 运行时,它们会运行程序,运行完成后,它们会关闭它。

由于您的程序的唯一功能是打印出一个值,因此它会执行此操作并关闭。

您应该尝试在最后添加一些要求用户输入的内容,或者将其编译为 .exe 并自己从命令行运行。

既然你开始了,我建议你自己从命令行运行它。您最终将了解用户输入,并且可以在使用程序时打开命令行窗口。

【讨论】:

    【解决方案2】:

    首选的解决方案是从命令行运行可执行文件。

    【讨论】:

      【解决方案3】:

      尝试从命令行运行您的二进制文件。

      【讨论】:

        【解决方案4】:

        那是因为可执行文件打开了它自己的对话框。当可执行文件完成运行时,它会关闭它打开的对话框以便运行。但是,当您是打开对话框的人时,当您关闭它时它会消失。

        因此,如果您打开命令提示符然后运行可执行文件,对话框不会自动关闭。

        【讨论】:

          【解决方案5】:

          如果您没有从已经打开的命令行窗口运行命令行 exe,Windows 将在程序终止后自动关闭窗口。尝试打开 cmd.exe,导航到程序目录并从那里运行它,窗口应该保持打开状态。

          【讨论】:

          • 这个想法特别适合尝试通过 K&R 练习的人。
          【解决方案6】:

          正常行为。

          您的程序按主程序的顺序执行每个操作。所以它打印,然后继续下一个操作,没有,所以它退出。由于控制台窗口与您的 .exe 相关联,因此命令窗口会随程序一起关闭。

          如果您不希望您的程序立即退出,您可以让它休眠,或者在退出前等待用户输入。

          【讨论】:

            【解决方案7】:

            在 Windows 中双击 .exe 时,您将启动一个新进程。 Windows 有 2 种基本进程类型:窗口和命令行。您编写的 hello world 示例是一个命令行进程。

            命令行进程将在启动时启动一个新的命令窗口。这是弹出的窗口,主要是黑色背景和白色文本。程序完成后,窗口将关闭。

            【讨论】:

              【解决方案8】:

              添加

              system("pause");
              

              返回前的行。这不是最好的,但通用的方法。

              【讨论】:

              • 注意:system("pause") 永远不应该出现在生产代码中。
              • 请不要。当然它可以在 Windows 上完成这项工作,但它不会在其他操作系统上工作。最好学习如何使用 C 库等待字符输入。
              • 我不认为“你好,世界”注定要用于生产。也许我错了。毕竟,放屁声在 iPhone 上能赚大钱。
              • 将那个投票改回 0,因为随后的 cmets 教会了我一些有用的东西。 (真的,放屁声也能赚钱?天啊,天啊,天啊……)
              【解决方案9】:

              那是因为从可执行文件中,它在新窗口中执行您的代码,然后该过程完成,它没有理由保持打开状态,您想做的事情已经完成。您可以做几件事。您可以从 cmd.exe 命令行执行它,或者您甚至可以在代码末尾添加一些东西来监听按键,一旦检测到按键,就让程序退出。

              【讨论】:

                【解决方案10】:

                没有人明确告诉你这一点,所以我会:

                双击文件时看到的是正常。您的 IDE 所做的(保持窗口打开)是一个功能,可帮助您调试应用程序。

                为什么会这样?

                由于您正在开发一个控制台 应用程序,因此您的应用程序必须有一个控制台来显示其输出。如果还没有,则会创建一个新控制台(即黑色窗口)。

                如果您从控制台内部(例如,从cmd.exe)启动程序,它只会继承父控制台而不创建新控制台[1]。

                在使用控制台的最后一个应用程序退出后(在第一种情况下,它只是您的程序),控制台关闭。对于在不带参数运行时只打印帮助文本的控制台应用程序,您会一直注意到这一点。如果从资源管理器中双击它们,带有一些文本的黑色窗口会闪烁,然后立即关闭。

                • 有时,执行某些操作并立即关闭的程序正是您想要的。例如,您可以从脚本中调用这些应用程序。

                • 另一方面,您的应用程序可以是交互式的:等待用户输入,做一些事情,并且只有在用户告诉它时才退出。显然,您不能编写这些应用程序的脚本,因为您需要有人在键盘前告诉应用程序该做什么。

                现在我们进入 IDE 部分:假设您正在开发第一种应用程序,它执行某些操作然后立即关闭。每次运行时屏幕闪烁和消失不是很方便,因为如何判断程序是否运行?假设您可以从它生成的输出中看出这一点。

                您当然可以启动一个命令行窗口并从那里运行应用程序,但该程序将与 IDE 分开执行,您将失去实时调试功能。

                因此,IDE 制造商为控制台应用程序提出了一项功能:当您直接从 IDE 运行应用程序时,他们通常会等待按键。这使您有机会检查带有输出的窗口,以确认应用程序正常工作。


                [1] Esoterica:除非您通过不继承控制台的应用程序。该应用程序启动的任何控制台应用程序都不会继承控制台,因为 GUI 应用程序破坏了继承。例如,start.exe 就是这样做的。比较:

                foo.exe (inherits the console)
                start foo.exe (start.exe is a GUI app, so foo.exe is launched in a new console)
                

                【讨论】:

                • 感谢您提供非常完整的答案。快速跟进,假设我的 .exe 文档位于“我的文档”文件夹中的某个位置,如何从 cmd 提示符运行它?我意识到这是低于基本的一步......
                • 哇。很好、完整且易于理解的答案。
                • 首先,您必须“移动”到可执行文件所在的目录,就像在资源管理器中一样。您可以使用命令 cd 来更改目录。像这样: `cd "C:\Docu\userMy Do" 等。 可以帮助您,因为它会自动完成目录名称,因此您不必输入它们:)。
                • exe文件不是文档。它是一个可执行文件,因此计算机可以运行它。您不能运行任何文档——当双击一个文档时,Windows 会自动运行相关的应用程序(它本身是一个可执行文件)来打开它。只是为了说清楚......
                • JDelage:实际上有一个很酷的技巧可以避免所有 cd 的东西:打开 cmd 提示符,键入“cd”(带空格),然后将文件从 Windows 资源管理器拖放到命令窗口。您将看到 'cd "C:\Documents and Settings\JDelage\My Documents\hello.exe'。退格离开实际的程序名称,使其只是 'cd "C:\Documents and Settings\JDelage\My Documents',然后按输入,你就在那里!
                【解决方案11】:

                在右大括号前添加getch();。这将在打印输出后提示输入。一旦你输入一个字符,窗口就会关闭。这应该可以解决您的问题。

                【讨论】:

                  【解决方案12】:

                  这是我的看法:

                  // Hello sweetie (Spoilers)
                  #include <iostream>
                  using namespace std;
                  
                  int main()
                  {
                  // Print the text to screen
                      cout << "************************************";
                      cout << "\n";
                      cout << "Hello World!";
                      cout << "\n";
                      cout << "You may close me by pressing Enter";
                      cout << "\n";
                      cout << "************************************";
                      cout << "\n";
                      cout << "\n";
                  
                  /*
                  This will prompt for an input after the output is printed.
                  Once you hit the Enter key the window will close.
                   */
                      if (cin.get() == '\n')
                      return 0;
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 2020-05-26
                    • 1970-01-01
                    • 2018-03-08
                    • 1970-01-01
                    • 2017-09-13
                    • 2013-04-07
                    • 2010-10-12
                    • 2021-03-12
                    • 1970-01-01
                    相关资源
                    最近更新 更多