2009-06-26 36 views
10

我正在嘗試爲K & R「Hello,world」生成一個.exe文件。在這本書中給出的代碼是:爲什麼我的程序輸出在Windows中閃爍並關閉?

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

當我建立從代碼::塊&運行(在Windows XP),我得到的「Hello World」的消息提示窗口。它保持打開狀態,直到我手動關閉它。但是,當我雙擊.exe文件時,提示只會閃爍並消失,爲什麼?

+0

地址: _asm INT 3 – toto 2009-06-26 13:08:15

+0

您可以點擊這裏[我的回答這個問題] [1] http://stackoverflow.com/a/30826808/ 5007758 – Khalif21 2015-06-14 07:10:05

回答

19

沒有一個明確告訴你這一點,所以我會:

你所看到的,當你雙擊該文件是正常。 (保持窗口打開狀態)是一個功能以幫助您調試應用程序。

這是爲什麼呢?

由於您正在開發控制檯應用程序,因此您的應用程序必須有一個控制檯才能在其上顯示其輸出。如果還沒有,則會創建一個新的控制檯(這是黑色的窗口)。

如果從控制檯內部啓動程序(比如說,從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) 
4

當從IDE這樣運行時,他們運行該程序,並在完成運行時關閉它。

由於您的程序的唯一功能是打印出一個值,它會這樣做並關閉。

您應該嘗試添加一些要求在最後輸入用戶或將其編譯爲.exe並自行從命令行自行運行的內容。

既然你開始了,我會建議你自己從命令行運行它。您最終將瞭解用戶輸入,並且您可以在使用程序時打開命令行窗口。

1

首選的解決方案是從命令行運行可執行文件。

1

嘗試從命令行運行您的二進制文件。

1

這是因爲可執行文件打開了自己的對話框。當可執行文件完成運行時,它將關閉爲打開運行而打開的對話框。但是,當您打開對話框時,它會在您關閉它時消失。

因此,如果打開命令提示符並運行可執行文件,對話框將不會自動關閉。

16

如果您沒有從已經打開的命令行窗口運行命令行exe,Windows會在程序終止後自動關閉窗口。嘗試打開cmd.exe,導航到您的程序目錄並從那裏運行它,窗口應該保持打開狀態。

+1

這個想法對於那些試圖通過K&R練習而努力的人來說尤其有益。 – Dingo 2009-06-26 13:11:01

3

正常行爲。

你的程序按照main的順序執行每個動作。所以它會打印出來,然後轉到下一個操作,沒有任何操作,所以它退出。由於控制檯窗口綁定到您的.exe,命令窗口與程序關閉。

如果您不想讓程序立即退出,您可以讓它休眠,或者在退出之前等待用戶輸入。

3

雙擊Windows中的.exe文件時,您正在啓動一個新進程。 Windows有兩種基本的流程類型:窗口和命令行。你寫的hello world樣本是一個命令行過程。

命令行進程將在啓動時啓動一個新的命令窗口。這是彈出的窗口,主要是帶有白色文本的黑色背景。完成一個程序後,該窗口將關閉。

0

返回之前剛剛加

system("pause"); 

線。這不是最好的,但通用的方法。

+0

注意:系統(「暫停」)不應出現在生產代碼中。 – Brian 2009-06-26 12:59:54

1

這是因爲從可執行文件中,它在新窗口中執行您的代碼,然後完成該過程,沒有理由保持打開狀態,您想要完成的操作。有幾件事你可以做。您可以從cmd.exe命令行執行它,或者您甚至可以在代碼的末尾放置一些偵聽按鍵的代碼,並且一旦檢測到關鍵筆劃,就允許程序退出。

2

在大括號之前加上getch();。這將在輸出打印後提示輸入。一旦你輸入一個字符,窗口就會關閉。這應該可以解決你的問題。

0

這是我對這個:

// 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; 
} 
相關問題