【问题标题】:strncpy overwrites existing character stringstrncpy 覆盖现有字符串
【发布时间】:2011-09-10 00:10:59
【问题描述】:

我创建了一个将数字转换为罗马数字的函数。我知道转换本身的逻辑是正确的,但是,每次调用 strncpy 时,它都会覆盖“rom”的先前值。我什至尝试背靠背调用它,但它只返回了后者。

这是代码中的一个 sn-p:

   char* rom = (char*) calloc (10,sizeof(char));

    while(intval>=1000){
        intval -= 1000;
    strncpy(rom,"M",2);
    }

也许使用 calloc 是问题的一部分,但我尝试使用 malloc 并且它给了我相同的结果。

【问题讨论】:

  • 您可以在您的问题中发布代码,这是首选,这样如果外部网站出现故障,链接不会中断,问题也不会变得无用。
  • 两个挑剔。首先 - sizeof(char)1,为什么还要写出所有这些?第二 - 不要从 calloc() 转换返回值 - 它可以隐藏 #include 错误,这些错误会作为链接器错误回来咬你。
  • strncpy 正在做 strncpy 所做的事情。在您的情况下,由于您的所有源值都是文字,并且您正在指定文字的长度,包括空终止符,因此它完全符合 strcpy 的作用。
  • 请注意,您可以通过在每次分配 rom 后增加它来解决问题。例如,strcpy(rom,"M"); rom += strlen("M"); 然后rom 总是指向下一个存储位置,您可以使用便宜的 strcpy 与(稍微)更昂贵的 strcat。 (当然,您需要保留指向rom 的原始开头的指针才能访问最终结果。)

标签: c strncpy


【解决方案1】:

你想追加,但 strcpy 只是复制到地址(并覆盖)。使用strcatstrncat

【讨论】:

    【解决方案2】:

    我相信你想要strcat() 而不是strcpy()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      相关资源
      最近更新 更多