0

私のCプログラムでfgetsは、データを読み取っていません。以下のコードを参照してください。

#include <stdio.h>
int main()
{
        char string[50];
        int marks,i,n, limit;
        printf("Enter Limit : \n");
        scanf("%d", &limit);
        FILE *fptr; fptr=(fopen("string.txt","w"));
        if(fptr==NULL){
                printf("Error!");
                return 0;
        }
        printf("Enter a string : \n");
        fgets(string, sizeof(string), stdin);
        fwrite(string, 1, sizeof(string), fptr);
        fclose(fptr);
        return 0;
}

制限に入ると、プログラムは「文字列を入力してください」と表示し、終了します(データを入力する前に)。scanf("%d", &limit);ステートメントを削除すると、正常に 動作します。getchar();また、上記のステートメントを追加すると、fgets正常に機能します。この問題の背後にある理由を知っている人はいますか?

4

3 に答える 3

4

これは、コードの前半で を使用scanfしたためです。数値を入力として入力する場合、Enterキーを押して入力の終わりをマークし、入力バッファーに改行を追加します。数値を読み取りますがscanf、入力バッファーに改行 (キーを入力) を残します。次に、呼び出すfgetsと、この唯一の改行が表示され、読み取られます。

これに対する非常に簡単な解決策はscanf、フォーマット コードの後に​​単一のスペースを追加して、末尾の空白をスキップするように指示することです。

scanf("%d ", &limit);
/*       ^         */
/*       |         */
/* Note space here */

上記の解決策が機能しない場合は、改行を取得するまで文字を読み取ることができます。

int c;
while ((c = fgetc(stdin)) != EOF && c != '\n')
    ;

また、Mac OSX にはfpurge、入力ストリームから未読データをクリアするために使用できる関数があります。

fpurge(stdin);

注:このfpurge関数は移植できません。

Linux と Windowsfflushで同じことを実行するために使用できますfpurgeが、それを可能にするのは Linux と Windows のライブラリの拡張機能であることに注意してください。fflushC 仕様によると、入力ストリームでの呼び出しは未定義の動作です。Linux のマニュアル ページWindows のリファレンス ページなどを参照してください。

于 2013-12-17T11:50:53.370 に答える
0

これは、前の によって残されfgetsた改行文字を読み取るためです。これを食べ尽くす 1 つの可能な方法は、 afterを追加します。 \nscanf\ngetcharscanf

    getchar();
    printf("Enter a string : \n");
    fgets(string, sizeof(string), stdin);
于 2013-12-17T11:51:35.140 に答える
0

数値を使用sscanfして入力する場合は、「Enter」を押します... 数値は によって処理されますがsscanf、「Enter」は によって処理されますfgets

于 2013-12-17T11:50:13.380 に答える