gpt4 book ai didi

c - 当我扫描二维数组时,它没有扫描所有值

转载 作者:行者123 更新时间:2023-11-30 17:14:51 27 4
gpt4 key购买 nike

我的代码:

#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;
}

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

 5 5

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

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

现在程序停止扫描。本来应该再扫描一次,但没有。为什么?

最佳答案

%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;
}

错误消息还有很大的改进空间,但是报告标准错误上的错误很重要,报告一些消息也很重要,以非零(非成功)状态退出也很重要。

关于c - 当我扫描二维数组时,它没有扫描所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30159321/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com