【发布时间】:2022-01-06 14:36:41
【问题描述】:
我想给程序一个从 1 到 26 的整数值(不需要硬编码),它创建一个 char 数组,其中填充了从 A 到字母 n 的字母。 这是代码:
int main(int argc, char *argv[])
{
int n = atoi(argv[1]);
char comb[n];
for (int i = 0; i < n; i++)
comb[i] = 65 + i;
printf("%s", comb);
}
问题是,如果我交出 8 - 15 和 24 - 26 的值,输出会显示如下: ABCDEFGH............
但是,如果我将 n 硬编码为上述有问题的值之一,则输出是正确的。
有人可以向我解释一下,为什么程序会输出额外的... 谢谢
【问题讨论】:
-
您似乎忘记了字符串实际上称为 null-terminated 字符串。要将字符串作为字符串正确处理,您需要在末尾添加空终止符
'\0',当然还要为其分配空间。 -
我的猜测是该字符串是 nut null 终止的,因此这些额外的字符只是内存中的垃圾回收。重新启动,您可能会看到不同的结果。一种解决方案是使您的
comb数组大小为 n+1,并在数组末尾添加一个 (char) 0。 -
谢谢,如果我理解正确,代码一定是这样的吗?字符梳[n]; for (int i = 0; i
-
@Slashstep 正确,应该可以解决问题 :) - godbolt example
-
另外几个注意事项,请尽量避免使用magic numbers。如果您的值
65是指'A'的ASCII 值,那么请使用'A'。但还要注意,您正在做的事情是不可移植的。有允许的字符编码,其中字母不是像 ASCII 那样的连续序列。最后,通过在没有任何验证的情况下接受这样的用户输入,用户可能会给出一些无效的输入,这可能会导致各种麻烦,至少它可能超出 ASCII 中大写字母的范围。