0

このデータが与えられた場合、18 行目がコメント化された次のコード:

1
3 3 1

収量

field 1 1
field 1 2
field 1 3
field 2 1
field 2 2
field 2 3
field 3 1
field 3 2
field 3 3

ただし、この行をそのままにしておくと、2 ステップごとに scanf(...) しか実行されません。問題はどこだ?

#include <stdio.h>

char field[102][102];

main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int r, c, n, i, j;
        scanf("%d %d %d", &r, &c, &n); // wczytanie liczby wierszy, kolumn, dni
        for (i=1; i<=r; i++) // wiersze
        {
            for (j=1; j<=c; j++) // kolumny
            {
                printf("field %d %d\n", i, j);
                scanf("%c", &field[i][j]); // line 18 here
            }
        }
    }
    return 0;
}
4

2 に答える 2

1

問題は、文字をスキャンすると、実際には 2 つ送信されることです。スキャンされた文字と、次に読み取られる「非表示」の '\n' です。scanf の後に getch() を使用して、その改行を読み取る (および破棄する) だけです。

于 2012-10-23T19:02:50.787 に答える
0

したがって、2D 配列に文字を手動で入力しようとしているようです。

BlackBear が述べたように、文字入力を探す'\n'たびに無料の文字を取得しています。scanf()そのため、ユーザーからの入力を「スキップ」しています。入力されている文字の ASCII を印刷すると、これを確認できます。

printf("field %d %d\n", i, j);
scanf("%c", &field[i][j]); // line 18 here 
printf("%d\n", field[i][j]);   // This line will print the values as they're going
                               // into the field array

したがって、これを使用すると、次のようになります。

1
2 2 1
field 1 1
10           <-- I didn't enter anything! but there's a ASCII 10 there
field 1 2
h            <-- I entered 'h', which is 
104          <-- ASCII 104 (in dec)

したがって、これをASCII テーブルにコンパイルすると、 10 が改行であることがわかります。

改行を(それぞれでscanf())再度消費すると、問題が解消されます。

    scanf("%d",&t);
    getchar();
    ...
    scanf("%d %d %d", &r, &c, &n); // wczytanie liczby wierszy, kolumn, dni
    getchar();
    ...
    scanf("%c", &field[i][j]); // line 18 here 
    getchar();

また、変数が使用されていないことに注意してくださいn

于 2012-10-23T19:29:03.237 に答える