2011-12-10 89 views
-3

我正在寫一個小代碼,只有五行,但它不能以正確的順序運行。 編譯此代碼後,它將首先執行"dir",然後打印我的字符串。我的C代碼不能按順序運行

但是,如果我將其更改爲printf ("%s\n", "asdf");,程序將以正確的順序運行。 我想知道爲什麼會這樣。 (PS,我的電腦是用gcc 4.6.2創建的,我也用clang,但是他們有相同的結果。) 謝謝大家。 下面是代碼:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    printf ("%s", "asdf"); 
    system ("dir"); 

    return 0; 
} 

回答

2

看起來像dirprintf是因爲printf打印到stdoutstdout緩衝輸出正在執行的原因 - 你的程序以正確的順序執行。的stdout緩衝器是通常沖洗時(如我在this answer提及):

  • 的換行('\n')是要被打印
  • 您在從stdin
  • fflush()讀取上調用它

這就是爲什麼添加一個換行符('\n')正在打印的字符串導致"asdf"在第e的輸出爲dir

刷新緩衝區的其他替代方法包括打印到stderr(未緩衝),或使用setbuf(stdout, NULL);stdout完全禁用緩衝區。但是,這兩種方法都不適合您的情況。

5

我向你保證,你的代碼是爲了運行。 printf可能會打印到您的程序未清除的緩衝區,因此dir的輸出直接進入終端,而printf的輸出等待,直到您的程序退出時發生的輸出緩衝區被清除。當您打印換行\n時,緩衝區也會被清除,這就是爲什麼打印"%s\n"似乎正常工作,但只是"%s"似乎失敗。

+0

我明白了。謝謝! – madper

3

\n表示可以在某些系統(如Solaris)上打印緩衝區。這是一個功能,而不是一個錯誤。

+0

我明白了,非常感謝! – madper

1

你應該寫

printf("%s\n", "asdf"); 
fflush (NULL); // or at least fflush(stdout) 
system ("dir"); 

但仍然很醜陋和非移植的代碼。要遍歷一個目錄,你認爲readdir &朋友?

+0

說實話,'readdir'並不是真的可移植的(除非使用一些額外的第三方頭文件/ lib)。 – Mario

+0

我認爲它是POSIX,所以是標準化的......我同意並非所有的系統甚至都有目錄的概念......標準C只知道文件... –

1

當然,訂單總是正確的。我想你認爲執行順序不正確,因爲控制檯在printf輸出之前顯示由「dir」生成的文本行。但這並不意味着一個是在另一個之前完成的。我不知道打印緩衝區如何在你的系統中工作,但是肯定有一個文本緩衝區,每個進程發送到任何輸出管道。

我的猜測是當CR字符出現時,輸出流的文本緩衝區會立即刷新。所以,如果你不寫'\ n'字符,運行「dir」(你正在調用的os系統進程)的進程會在你的進程執行之前刷新它的輸出。