当我扫描2D阵列时,它不会扫描所有值

时间:2015-05-11 03:41:23

标签: c helper helpers view-helpers

我的代码:

#include <stdio.h>
#include <string.h>
int main (){
    int i, j, L, C;
    scanf("%d%d", &L, &C);
    char Arrayy[L][C];
    for(i=0;i<L;i++){
         for(j=0;j<C;j++){
            scanf("%c", &Arrayy[i][j]);
         }
    }
    return 0;
} 

例如,我想扫描一个字符映射。地图中的“.”是水,“#”是土地。地图大小为5x5。输入是:

 5 5

好的,L和C将为5.输入%c矩阵:

.....
..#..
.###.
..#..

现在程序停止扫描。它应该再扫描一次,但事实并非如此。为什么呢?

1 个答案:

答案 0 :(得分:0)

%c也会读取换行符。您应该检查scanf()的返回值。您可以随时打印每个字符,以确保您知道发生了什么。使用" %c"作为格式。这将跳过空格(例如换行符),只读取非空白字符,为您提供预期的结果。

%c读取的第一个字符是第二个5之后的换行符,它解释了程序停止读取的原因。在5之后有一个换行符,然后是4行6个字符(5个可见字符加一个换行符),总共扫描了25个字符,这是它想要的数字。 “这很有意思:对于大小为NxN的方形矩阵,你会在第二个N之后得到一个换行符,然后是N-1个换行符,每个行加上N + 1个字符,所以你总是停一行。

调试代码

添加打印语句,以便确切知道发生了什么。

#include <stdio.h>
#include <string.h>

int main(void) {
    int i, j, L, C;
    if (scanf("%d%d", &L, &C) != 2) {
        fprintf(stderr, "Oops!\n");
        return 1;
    }
    char Arrayy[L][C];

    for (i = 0; i < L; i++) {
         for (j = 0; j < C; j++) {
            if (scanf("%c", &Arrayy[i][j]) != 1) {
                fprintf(stderr, "Oops!\n");
                return 1;
            }
            printf("[%d,%d] = <%d>\n", i, j, Arrayy[i][j]);
         }
    }

    for (i = 0; i < L; i++) {
        for (j = 0; j < C; j++)
            printf("<%c>", Arrayy[i][j]);
        putchar('\n');
    }

    return 0;
}

工作代码

#include <stdio.h>
#include <string.h>

int main(void) {
    int i, j, L, C;
    if (scanf("%d%d", &L, &C) != 2) {
        fprintf(stderr, "Oops!\n");
        return 1;
    }
    char Arrayy[L][C];

    for (i = 0; i < L; i++) {
         for (j = 0; j < C; j++) {
            if (scanf(" %c", &Arrayy[i][j]) != 1) {
                fprintf(stderr, "Oops!\n");
                return 1;
            }
         }
    }

    for (i = 0; i < L; i++) {
        for (j = 0; j < C; j++)
            putchar(Arrayy[i][j]);
        putchar('\n');
    }

    return 0;
}

有很多空间可以改进错误消息,但报告标准错误的错误非常重要,并且报告某些消息很重要,并且以非零(非成功)状态退出非常重要。