我的代码:
#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
矩阵:
.....
..#..
.###.
..#..
现在程序停止扫描。它应该再扫描一次,但事实并非如此。为什么呢?
答案 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;
}
有很多空间可以改进错误消息,但报告标准错误的错误非常重要,并且报告某些消息很重要,并且以非零(非成功)状态退出非常重要。