2013-10-09 12 views
6

私が以下のプログラムを実行すると、出力が出ません。無限ループwhilefでのprintfでの異常な動作

#include <stdio.h> 

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

    } 
    return 0; 
} 

私はprintfコマンドを編集して文字列の最後に '\ n'文字を追加すると、期待される出力が得られます。最初のコードで何が起こっていますか?私はそれを理解できません。

+0

'fflush(stdout)'を呼び出すと無限ループになります。 –

+3

出力がバッファされます。 @GrijeshChauhanが提案しているように、 'printf'の後ろに' fflush(stdout) 'を使ってください。入力関数( 'getchar'や' scanf'など)のように出力バッファをフラッシュする他の操作もありますが、コードスニペットからループが何をしているのかは不明です。 – lurker

+0

[プログラムが最終的なprintfステートメントを実行しないのはなぜですか?](http://stackoverflow.com/questions/11277796/why-does-program-not-execute-final-printfstatement) – lurker

答えて

10

を試してみてください。

fflush(stdout);に電話すると、強制的にバッファを端末にフラッシュできます。ちなみにstdinをフラッシュしないでください。これは許可されていません。

+0

しかし、なぜコードは無限ループなしで、上記と同じprintfで動作しますか? – DesirePRG

+0

stdinでこれをしないように指示するための+1 – fayyazkl

+3

プログラムが直ちに終了すると、フラッシュ要求とプログラムが続行されるのではなく、osは出力バッファをより早くフラッシュします。 – fayyazkl

2

はstdoutがフルラインが収集されるまで出力はデバイス(端末)に書かれていません。すなわちラインは、をバッファリングしているので、これがある

printf("hello\n"); 

または

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

'fflush(stdout)'は 'printf'の直後に現れます。 – lurker

+0

@mbratch真。私は編集しました、ありがとうございます。 –

0

出力の最後に改行を印刷する必要があります。それ以外の場合は、未定義のビヘイビアが呼び出されます(少なくとも定義されていない可能性があります)。

+1

「未定義のビヘイビアを呼び出す」とはどういう意味ですか? –

0

使用printf("hello\n");

詳細情報についてはthis questionへの回答を参照してください。

関連する問題