【发布时间】:2020-02-15 15:34:10
【问题描述】:
The output of code
我想创建一个字符数组,其中有“n”行,每行都有一个字符。在给定的代码中,我要求用户输入行数(n),然后创建一个变量“chr”,每行只包含一个字符。然后我逐个询问字符并将它们存储在各自的行中,但是当我打印这些字符时,会发生一些奇怪的事情。应该只存储自己的一个字符的第一行存储了不同行的所有字符。为什么?谁能给我解释一下?
#include <stdio.h>
int main(void) {
int n;
scanf("%d", &n);
char chr[n][1];
for (int i = 0; i < n; i++) {
printf("Enter the %d character?\n", i);
scanf("%s", chr[i]);
}
// printing
for (int i = 0; i < n; i++) {
printf("\n%s\n", chr[i]);
}
return 0;
}
【问题讨论】:
-
你只为每一行分配一个字节的内存。
-
因为您没有用空终止字节终止每个“行”,所以它将打印直到找到空字符。
-
@OldProgrammer 因为我只想从每一行中取出一个字符。
-
@fredrik 这不仅仅是关于打印。每个维度只能存储一个字符,
scanf为下一行的第一个也是唯一一个对象中的每个字符串写入终止/0。这个例程一遍又一遍地迭代,毕竟,内存只是一大堆“切片”字符串,加上最后一个/0超出了数组的范围。这是一个完整的未定义行为包,甚至还没有进入程序的打印部分。
标签: c arrays string character scanf