2

私はANSICの初心者ですが、質問があります。ばかげた質問かもしれませんが、申し訳ありません。

#include<stdio.h>
    main()
    {
          int age;
          printf("Hello World!\n");
          printf("Please enter your age: ");
          scanf("%d", &age);
          printf("You entered %d\n", age);
          fflush(stdin);
          getchar();
    }

scanf関数を学ぶのは私の2番目のプログラムです。私の質問は:printfscanffflushstdingetcharがstdio.hで定義されていることを知っていますが、 fflush(stdin)を使用する場合にのみ、#include < stdio.h >を指定する必要がありますが、他の方法を使用する場合はその行#includeを削除できます。

4

2 に答える 2

9

そのヘッダーで宣言された関数を呼び出すときは、持っている必要があります。#include <stdio.h>

わかりました、それは完全に真実ではありませ。言語標準の1989/1990バージョンでは、呼び出しによって関数の暗黙の宣言を作成できます。それがたまたま正しい宣言と一致する場合、あなたはそれで逃げることができます;。それ以外の場合、プログラムの動作は未定義です。つまり、プログラムを回避できるかどうかはわかりませんが、コンパイラーはそれについて警告する必要はありません。printf可変数の引数を取るため、未定義の動作を回避するために可視宣言が必要#include <stdio.h>です。可視宣言を取得する方法はです。

(関数を自分で宣言することもできますが、エラーが発生しやすく、それを行う理由はありません。)

C99以降では、暗黙の宣言はありません。

main()である必要がありますint main(void)

fflush(stdin)未定義の動作があります。scanf()呼び出し後に入力された文字を破棄したい場合は、それらを読み取って破棄することができます。

于 2012-07-22T22:54:58.603 に答える
2

おそらくそのヘッダーファイルが必要なので、stdin定義されます。コンパイラの警告をオフにしている場合、コンパイラは未定義の関数について通知しません。(実際に未定義の場合は、後でリンカーエラーが発生します)。stdinは型の変数でFILE *あり、関数ではありません。

電話しないでくださいfflush(stdin)。未定義の動作があります。入力バッファをクリアする必要がある場合は、別の方法を使用してください。これを行う標準的な方法は、次の行の終わりまでデータの読み取りを試みることです。

int flush_line(FILE *file)
{
    int ch;
    do {
        ch = fgetc(file);
    } while (ch != '\n' && ch != EOF);
    if (ch == EOF && ferror(file)) {
        return -1;
    }
    return 0;
}

そして、あなたはを呼び出すでしょうflush_line(stdin)

移植性が問題にならない場合(これはWindowsでは機能しないことに注意してください)、一時的にファイル記述子を非ブロッキングにして、そこからすべての入力を読み取ることができます。

int flush_in(FILE *file)
{
    int ch;
    int flags;
    int fd;

    fd = fileno(file);
    flags = fcntl(fd, F_GETFL, 0);
    if (flags < 0) {
        return -1;
    }
    if (fcntl(fd, F_SETFL, flags | O_NONBLOCK)) {
        return -1;
    }
    do {
        ch = fgetc(file);
    } while (ch != EOF);
    clearerr(file);
    if (fcntl(fd, F_SETFL, flags)) {
        return -1;
    }
    return 0;
}

そして、あなたはを呼び出すでしょうflush_in(stdin)

于 2012-07-22T22:46:49.403 に答える