【问题标题】:Malloc and strncpymalloc 和 strncpy
【发布时间】:2013-10-20 17:24:36
【问题描述】:

我试图将一个字符串分成两部分以传递给两个孩子。第一部分应为 12 个“0”字符,第二部分应为 13 个“1”字符。当我执行这段代码时,我没有得到这些东西。具体来说,这是输出。 左父母:00000000000 父权:0000000000001 我不知道为什么,有人可以帮忙吗?

int bit_count(char *passed, int len){
int left = len/2;
int right =(len/2)+(len % 2);
char *lstring = malloc(sizeof(char)*(left+1));
char *rstring = malloc(sizeof(char)*(right+1));
strncpy(lstring, passed, sizeof(char)*12);
strncpy(rstring, passed+left, sizeof(char)*13);
printf("Parent Left: %s\n", lstring);
printf("Parent Right: %s\n", rstring);

【问题讨论】:

  • 如果您要在这里硬编码 12 和 13,为什么还要计算左右。这没有任何意义。
  • 对,我将其更改为只是为了了解正在发生的事情。最终我会左右用户。
  • 你不需要乘以sizeof(char) -- strncpy 的参数是要复制的字符数,而不是大小。
  • @Barmar,您评论的第二部分有点误导。 char 的数量和 C 中的“大小”是一回事。
  • @JensGustedt 我试图将它与使用malloc() 的方式区分开来,其中将事物的数量乘以每个事物的大小以获得大小参数。 strncpy 的参数不是事物的数量,而是要复制的字符数。

标签: c malloc strncpy


【解决方案1】:

问题在于strncpy() 如果由于限制而不是到达源字符串的末尾而停止,则不会添加空终止符。所以你需要添加空终止符。

int bit_count(char *passed, int len) {
    int left = len/2;
    int right = len - left;
    char *lstring = malloc(left+1);
    char *rstring = malloc(right+1);
    strncpy(lstring, passed, left);
    lstring[left] = '\0';
    strncpy(rstring, passed+left, right);
    rstring[right] = '\0';
    printf("Parent Left: %s\nParent Right: %s\n", lstring, rstring);
}

【讨论】:

    【解决方案2】:

    在每个 strncpy 后添加 NULL 字符

    lstring[left]='\0';
    
    
    rstring[right]='\0';
    

    【讨论】:

      【解决方案3】:

      如果您不需要strncpy,并且您不知道它的确切作用,请不要使用它。

      在您的情况下,这完全是多余的,无论如何,您都知道要复制的数组的大小。所以使用memcpy:

      memcpy(lstring, passed, left);
      lstring[left] = '\0';
      memcpy(rstring, passed+left, right);
      rstring[right] = '\0';
      

      【讨论】:

      • "如果你不需要strncpy,如果你不知道它的确切作用,请不要使用它。" any 函数也是如此。但是,是的,strncpy 特别具有误导性。
      • 谢谢。这行得通,你是对的,我不明白 strncpy。也许有一天。
      • strncpy() function的一个很好的解释。
      猜你喜欢
      • 1970-01-01
      • 2016-02-10
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多