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

但是,如果我保持原样,它只会每第二步执行一次 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

问题是,当您扫描一个字符时,您实际上发送了两个:被扫描的字母,以及下一次读取的“隐藏”'\n'。只需在 scanf 之后使用 getch() 来读取(并丢弃)该换行符。

于 2012-10-23T19:02:50.787 回答
0

因此,您似乎正在尝试手动填充带有字符的二维数组。

'\n'正如 BlackBear 所提到的,每次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 回答