我从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需要它?这是真的,我自己的方法没有错误吗?
答案 0 :(得分:1)
strncat:"将源的前几个num字符追加到destination,加上一个终止的空字符。"所以没有必要添加额外的1,你在realloc中考虑过它。
顺便说一下,strlen(0)会崩溃 - 你不认为安全功能吗?答案 1 :(得分:1)
如果你不能事先为“缓冲区”分配空间并决定继续使用realloc(),这里有一个提示:在strappend()函数中你已经知道了字符串的长度。因此,您不必调用strncat()。你可以简单地调用一个保证更快的memcpy()。所以,而不是:
strncat(c, n, nlen + 1);
呼叫:
memcpy(c + xlen, n, nlen);
c[xlen + nlen] = '\0';
直接回答你的问题是“不,你不需要那里的+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);
如果NULL
或x
传入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)