C附加两个字符串

时间:2014-04-18 11:31:21

标签: c

我从C开始,现在我想要将两个char *加在一起。我为这个问题写了这个方法:

char * strappend(char * x, char * n) {
  size_t xlen = strlen(x);
  size_t nlen = strlen(n);
  char * c = realloc(x, xlen + nlen + 1);
  strncat(c, n, nlen + 1);
  return c;
}

并像这样使用它:

char * buffer = malloc(5 * sizeof(char));
strcpy(buffer, "What");
buffer = strappend(buffer, "up");
printf("%s", buffer);
free (buffer);

现在我不确定strncat是否需要+ 1,我认为\ 0需要它?这是真的,我自己的方法没有错误吗?

4 个答案:

答案 0 :(得分:1)

strncat:"将源的前几个num字符追加到destination,加上一个终止的空字符。"所以没有必要添加额外的1,你在realloc中考虑过它。

顺便说一下,strlen(0)会崩溃 - 你不认为安全功能吗?

答案 1 :(得分:1)

  1. realloc()是一项昂贵的操作。你不要经常使用它。在这种情况下,根据代码的结构和要求,最好确保“缓冲区”有足够的空间用于连接字符串
  2. 如果你能在(1)中完成我的建议,你不需要你的strappend()函数。只需在代码中使用strncat()(当然使用适当的范围检查)
  3. 如果你不能事先为“缓冲区”分配空间并决定继续使用realloc(),这里有一个提示:在strappend()函数中你已经知道了字符串的长度。因此,您不必调用strncat()。你可以简单地调用一个保证更快的memcpy()。所以,而不是:

    strncat(c, n, nlen + 1);
    

    呼叫:

    memcpy(c + xlen, n, nlen);
    c[xlen + nlen] = '\0';
    
  4. 直接回答你的问题是“不,你不需要那里的+1”。查看man page

答案 2 :(得分:0)

sprintf非常方便:

const char* st = "START";
const char* en = " END";
char s[100];
sprintf(s, "%s%s", st, en);

答案 3 :(得分:0)

如果n引用0终止的数组(strlen()上可以隐含n),则只需使用

  strcat(c, n);

如果NULLx传入n,此函数也会引发未定义的行为。通过以下方式处理这些案件:

  size_t xlen = x ?strlen(x) :0;
  size_t nlen = n ?strlen(n) :0;

同样^ 2请注意这种情况,如此连接:

  if (n)
  {
    strat(c, n);
  }

最后,您可以考虑通过定义函数的参数来告诉编译器什么是常量,从而帮助编译器:

char * strappend(const char * x, const char * n)