C 用 n 值填充 char 数组导致问题
C fill char array with n values leads to problem
我想给程序一个从 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 硬编码为上述有问题的值之一,则输出恰到好处。
谁能给我解释一下,为什么程序会输出额外的 �。
谢谢
在 C 中将字符串转换为数字类型的标准方法是使用 strto*
函数族。在你的情况下,你会想要这样的东西:
int count = strtol(argv[1], // String
NULL, // Optional output pointer to where the scan stopped
10) // Radix
我还会检查 argc > 2
,即 argv[1]
是否确实由用户传递。
%s
需要一个指向 空终止字符串 的指针。换句话说,printf
在看到 '[=16=]'
之前无法知道字符串参数在哪里停止,所以您看到的是进程内存的其他部分作为文本打印出来。要修复:在循环之前为 comb
和 memset(comb, n + 1, 0);
分配 n + 1
,或者在循环之后立即设置 comb[n] = '[=20=]'
。
我想给程序一个从 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 硬编码为上述有问题的值之一,则输出恰到好处。
谁能给我解释一下,为什么程序会输出额外的 �。 谢谢
在 C 中将字符串转换为数字类型的标准方法是使用
strto*
函数族。在你的情况下,你会想要这样的东西:int count = strtol(argv[1], // String NULL, // Optional output pointer to where the scan stopped 10) // Radix
我还会检查
argc > 2
,即argv[1]
是否确实由用户传递。%s
需要一个指向 空终止字符串 的指针。换句话说,printf
在看到'[=16=]'
之前无法知道字符串参数在哪里停止,所以您看到的是进程内存的其他部分作为文本打印出来。要修复:在循环之前为comb
和memset(comb, n + 1, 0);
分配n + 1
,或者在循环之后立即设置comb[n] = '[=20=]'
。