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 硬编码为上述有问题的值之一,则输出恰到好处。

谁能给我解释一下,为什么程序会输出额外的 �。 谢谢

  1. 在 C 中将字符串转换为数字类型的标准方法是使用 strto* 函数族。在你的情况下,你会想要这样的东西:

    int count = strtol(argv[1], // String
                       NULL, // Optional output pointer to where the scan stopped 
                       10) // Radix
    

    我还会检查 argc > 2,即 argv[1] 是否确实由用户传递。

  2. %s 需要一个指向 空终止字符串 的指针。换句话说,printf 在看到 '[=16=]' 之前无法知道字符串参数在哪里停止,所以您看到的是进程内存的其他部分作为文本打印出来。要修复:在循环之前为 combmemset(comb, n + 1, 0); 分配 n + 1,或者在循环之后立即设置 comb[n] = '[=20=]'