2

重複の可能性:
Dev-C++入力がスキップされました

fgetsを使用してstdinから文字列の配列を読み取ろうとしていますが、読み取りたい最初の文字列は常に無視されます。この問題の原因は何ですか?

#include <stdio.h>

int main()
{
    int i;
    struct material
    {
        char name[30];
        float price, kg;
    };
    unsigned m,nr;
    printf("Lorry capacity=");
    scanf("%u", &m);
    printf("Number of materials=");
    putchar('\n');
    scanf("%u", &nr);
    struct material list[nr];
    for (i=0; i<nr; i++)
    {
        printf("Name=");
        fgets(list[i].name, 30, stdin);
    }
    putchar('\n');
    for (i=0; i<nr; i++)
    {
        printf("%s ", list[i].name);
    }
    return 0;
}
4

5 に答える 5

2
scanf("%u", &nr);
struct material list[nr];
for (i=0; i<nr; i++)
{
    printf("Name=");
    fgets(list[i].name, 30, stdin);

scanf("%u", &nr);改行を入力バッファに残すので、それfgets以上の入力を必要とせずに空の行を見つけます。

そのため(とりわけ)、(f)scanfとを混合することは一般的に悪い考えです。fgets

簡単な修正として、最初の前に入力バッファを空にしますfgets

int ch;
while((ch = getchar()) != EOF && ch != '\n');
if (ch == EOF) {
    // oops
}

より原則的な修正はfgets、改行を含む行全体を取得するために使用する前に値を読み取り、strtoulまたはで数値をデコードすることsscanfです。

于 2012-12-25T19:41:43.127 に答える
1

これは非常に一般的なエラーです。scanfで数値を読み取った後、Enterキーを押して入力した改行は入力バッファーに残るため、fgetsを最初に呼び出すと、その改行のみで構成される(非常に短い)行が読み取られます。

于 2012-12-25T19:41:46.740 に答える
1

入力バッファに残っている改行を で読み取ることで取り除くことができることに気付きましたgetchar()

また、次のコードを使用して、fgets() 入力から末尾の改行文字を削除する必要がありました。

char *pos;
if ((pos=strchr(Name, '\n')) != NULL)
    *pos = '\0';
于 2012-12-25T20:21:50.163 に答える
0

一般的に誤解されていることの1つは、ユーザーに入力を求めると、景品がもらえるということです。

コンピューターが材料の量を要求するとき:

材料数=
51

'5'そして、「51」と入力すると、実際には、、、'1'およびの3つの文字が表示されます'\n'。エンターキーを押すと、すべてに改行文字が付いてきます。

ユーザーから入力を取得するさまざまなユーティリティは、これをさまざまに処理します。fgets()改行を読み取り、入力をとして保存します"51\n"scanf()の文字列形式指定子を使用して文字列として読み取ると"%s"、数字のみが取得さ"51"れ、改行文字がstdinバッファに残ります。

したがって、あなたの場合、あなたは以下を介して番号を読みますscanf

scanf("%u", &nr);

これは改行を残し、次の読み取りを実行しようとすると:

fgets(list[i].name, 30, stdin);

fgetsその改行を取得して保存します。

したがって、ここで可能な修正はたくさんあります。1つは単に使用することであり、もう1つは、各scanfの後fgets()に改行を消費することです。選択はあなた次第です。getchar()

ところで:printfsに改行を挿入できます:printf("材料の数=\ n");

于 2012-12-25T21:11:07.300 に答える
-1

各 scanf の後に fgets を実行するだけで、保留中の改行が消費されます。

char dummy[10];
...
scanf (...);
fgets (dummy, 1, stdin);
于 2012-12-25T19:44:12.990 に答える