2017-04-21 12 views
-4

どうしてprintf( "prompt:")はすぐには印刷されませんか?私はfflush(stdout)を試して、\ 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用)。

あなたが

ところで、あなたはprintf("prompt:");fgetsを呼び出している(例えばfflush(stdout);を呼び出すことによって)、それをフラッシュする必要があります。それは間違っています。 printf("prompt:"); fflush(stdout);の前に、を呼び出す前にfgetsを呼び出すことをおすすめします。もちろん

、あなたはすべての警告と&デバッグ情報をコンパイルする必要がありますPOSIXシステムでは、時の最後のデバッガ(例えばgdb

を使用して(例えばgcc -Wall -gGCCを使用している場合)あなたはgetline(3)を使用することができます。 Linuxシステムでは、readline(3)も使用できます。

sscanfを使用すると、返品件数をよりよくテストできます(また、%nを使用することもできます)。

おそらく、(少なくともPOSIXシステムの)端末について、もっと詳しく読むべきでしょう。 tty demystifiedページ、およそline disciplineです。 termios(3) &i satty(3)も参照してください。

3

while((fgets(line, 1024, stdin))): - これはstdinから読み込まれ、lineにコンテンツを置くことを意味します。 fgetsは、EOFまたは改行文字を受信するまで返されません。つまり、あなたのコードはが "Enter"キーを押すまでを待つことを意味します。

これを押さないと、「プロンプト」が印刷されません。それが遅れている理由です!あなたが入力した押す前に入力するものは何でも

そして、私は `fgets`はそれの最も最初の1024バイトで行全体や店舗を待つことになると信じていline(最大1024バイト)

+1

に保存されます。 –

+0

@BasileStarynkevitch 'fgets'の第2パラメータは、"読み込む最大文字数 "を指定します。 1024バイトが受信されると、読み取りを停止します。 – Swanand

+2

改行があった場合にも読み込みを停止します。返されたキーが1024文字よりも少ないか少ないかに関係なく、データがプログラムに送られるまで戻りません。一部のシステムでは、ターミナル・ドライバは1行に1024文字まで受け付けません。 256バイト程度の制限があります。 –