5

重複の可能性:
改行が書式文字列に含まれていない限り、呼び出し後に printf がフラッシュされないのはなぜですか? (C)

私のコードprintfでは fget よりも前に書かれていますが、実行されず、実行後に実行されます。fgetsprintffgets

enum { max_string = 127 };
static char string[max_string+1] = "";

int main( int argc, char ** argv ) {    
      printf("Type a String: ");
      fgets(string, max_string, stdin);
      printf("The String is %s\n", string);
      return 0;
}
4

4 に答える 4

7

のフラッシュを行いますstdout

fflush(stdout);

fgets(...)

printf("Type a String: ");  
fflush(stdout);
fgets(string, max_string, stdin); 
于 2012-07-20T07:58:38.577 に答える
1

ポイントは のprintf後に実行されることではfgetsなく、その出力がその後に表示されることです。

これは、標準出力( で書き込んでいるファイル記述子printf) が行バッファリングされているために発生します。つまり、標準ライブラリは、改行文字 ( \n) を印刷用に受け取った後、印刷を延期します。

からman stdout:

ストリーム stdout は、端末を指す場合、行バッファリングされます。fflush(3) または exit(3) が呼び出されるか、改行が出力されるまで、部分的な行は表示されません。

さまざまな結果を調べるには、例を編集して を使用するfflushか、 を使用して標準エラーに出力しfprintf(stderr, ...ます。

于 2012-07-20T08:01:01.047 に答える
0

ニールは正しい。「\n」を付けずに何かを書き留めたい場合は、関数 write(); を使用できます。

#include <stdio.h>
#include <unistd.h>
#include <string.h>

enum { max_string = 127 };
static char string[max_string+1] = "";


my_putstr(char *str)
{
     write(1, str, strlen(str));
}

int main( int argc, char ** argv ) {    
    my_putstr("Type a String: ");  
    fgets(string, max_string, stdin); 
    printf("The String is %s\n", string);
    return 0;
}
于 2012-07-20T08:00:15.410 に答える
0

ステートメントを\n入れます。バッファが行で終了printfしているため、これが問題である可能性があります。C

于 2012-07-20T07:55:14.183 に答える