2011-10-31 7 views
1

私のコードは次のとおりスクリーン印刷が紛らわしいですか?

#include <stdio.h> 
void main(int argc, char** argv) { 
    printf("%s", argv[0]); 
    system("pwd"); 
} 

出力である:

[[email protected] studio]$ ./a.out 
/home/river/Desktop/studio 
./a.out[[email protected] studio]$ 

それは次に[0] argvの印刷、最初にそのシステム( "PWD")プリントです。どうして?私は、次のようなステートメントを追加する場合 :

#include <stdio.h> 

    void main(int argc, char** argv) { 
     printf("%s", argv[0]); 
     fflush(stdout); 
     system("pwd"); 
    } 

出力は次のようになります。

[[email protected] studio]$ ./a.out 
./a.out/home/river/Desktop/studio 

それは正常に動作し、なぜですか?

答えて

2

printfコールは出力をバッファに入れます。バッファを実際に書き込むには、をフラッシュしてにする必要があります。改行を印刷すると、出力は自動的にフラッシュされるので、printfの書式文字列を"%s\n"に置き換えると、fflushを呼び出すことなく動作するはずです。

+1

...と出力ストリームをフラッシュしたり、出力ストリームを使用しない "システム" を呼び出します - "system"によって呼び出されたコマンドは直接コンソールに直接書き込みます。そして、プログラムが終了するとバッファがフラッシュされ、あなたが印刷した行が表示されます。 –

1

他の方法に '修正' は、それ:

printf("%s\n", argv[0]); 

事がstdoutがデフォルトでlinebufferedされていることです。

参照:

  • はsetbuf()、はsetvbuf()
  • stdbuf