2017-04-21 115 views
-4

printf(「prompt:」)不會立即打印?我試過fflush(標準輸出)並放置\ n但這些都沒有工作。它只是打印時 「看你的」 打印:C程序的混淆行爲,printf

int main() { 
    char line[1025]; 
    char command[80], argument[80]; 
    char argv[3][80]; 
    int i, pid; 
    *(argv[2]) = '\0'; 

    while((fgets(line, 1024, stdin))) { 
     printf("prompt:"); 

     line[1024] = '\0'; 
     sscanf(line, " %s %s ", command, argument); 

     if(strcmp(command, "exit") == 0 || strcmp(command, "hastalavista") == 
      0) { 
      printf("See you\n"); 
      exit(0); 
     } 
    } 
    return 0; 
    } 

回答

5

標準I/O(即從<stdio.h>功能)是緩衝(通常行緩衝,特別是對於stdout)。

您需要刷新它(例如,通過調用fflush(stdout);

順便說一句,你之前printf("prompt:");調用fgets。它看起來錯了。我建議printf("prompt:"); fflush(stdout);之前呼籲fgets

當然,你應該與所有警告編譯&調試信息(例如gcc -Wall -g如果使用GCC)和使用調試器(例如gdb

最後,在POSIX系統中,您可以使用getline(3)。在Linux系統上,您甚至可以使用readline(3)

隨着sscanf你會更好地測試其返回項目數(你可能想要使用%n)。

您可能應該閱讀更多關於終端(至少在POSIX系統上)的信息,例如tty demystified頁面,以及約line discipline。另見termios(3) & i satty(3)

3

while((fgets(line, 1024, stdin))): - 這意味着從stdin讀取並將內容放入linefgets在收到EOF或換行符後纔會返回。這意味着,您的代碼將等待,直到您按下「Enter」鍵。

如果您不按下,它將不會繼續並打印「提示」。這就是爲什麼延遲!

而且,不管你按下輸入將被存儲在line前鍵入(最大1024個字節)

+1

我相信'fgets'將等待最多的前1024個字節的是整條生產線和商店。 –

+0

@BasileStarynkevitch'fgets'中的第二個參數指定「要讀取的最大字符數」。如果收到1024字節,它將停止讀取。 – Swanand

+2

如果遇到換行符,它也會停止閱讀。直到通過點擊返回鍵將數據發送到程序時,它也不會返回任何內容,無論輸入的字符是否多於或少於1024個字符。在某些系統中,終端驅動程序在一行中不會接受多達1024個字符;該限制較小,如256字節左右。 –