2013-10-09 39 views
6

當我運行下面的程序時,我沒有得到任何輸出。帶有無限while循環的printf的異常行爲

#include <stdio.h> 

int main() 
{ 
    printf("hello"); 
    while(1) 
    { 

    } 
    return 0; 
} 

而如果我編輯printf命令添加'\ n'字符到字符串的末尾,那麼預期的輸出。第一個代碼中發生了什麼?我簡直無法理解它。

+0

調用'fflush(stdout)'順便說一句,你有無限循環。 –

+3

輸出被緩衝。你需要在字符串末尾加上'\ n'來打印出來,或者在你的'printf'後面使用'fflush(stdout)'作爲@GrijeshChauhan的建議。還有其他一些操作會刷新輸出緩衝區,比如輸入函數('getchar'或'scanf'),但從代碼片段中不清楚你的循環正在做什麼。 – lurker

+0

[爲什麼程序不能執行最終的printf語句?]可能的重複(http://stackoverflow.com/questions/11277796/why-does-program-not-execute-final-printf-statement) – lurker

回答

10

這是因爲stdout是行緩衝,即,輸出不被寫入到設備(終端),直到一個完整的行已被收集。

您可以撥打fflush(stdout);強制緩衝區刷新到終端。順便嘗試沖洗stdin,這是不允許的。

+0

好的,但爲什麼代碼的工作沒有無限循環,並與上面相同的printf? – DesirePRG

+0

+1,用於告訴不要使用標準輸入執行此操作。 – fayyazkl

+3

當程序很快終止時,操作系統會更快地刷新輸出緩衝區,而不是無刷新請求並繼續執行程序。 – fayyazkl

2

嘗試

printf("hello\n"); 

printf("hello"); 
fflush(stdout) 
+0

您應該指出'fflush(stdout)'在'printf'後面出現。 – lurker

+0

@mbratch真的。我編輯了,謝謝。 –

0

您應該在輸出結尾處打印換行符。否則,它會調用未定義的行爲(至少可能未定義)。

+1

你是什麼意思「調用(可能)未定義的行爲」? –

0

使用printf("hello\n");

欲瞭解更多信息請參閱答案this question