【问题标题】:C fill char array with n values leads to problemC用n值填充char数组会导致问题
【发布时间】: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 中大写字母的范围。

标签: arrays c for-loop char


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

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

    我还要检查argc &gt; 2,即argv[1]实际上是由用户传递的。

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

【讨论】:

    猜你喜欢
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 2017-02-25
    相关资源
    最近更新 更多