可能重复:
Any better suggestions for this c functions copyString,concatString
我正在尝试使用指针编写strcat,我无法更改main()。
void str_cat(char **s1,char *s2) {
while(**s1)
*(s1++); /* go to the end of string1*/
/* copy string 2 at the end of string 1*/
while(*s2)
*(s1++) = (s2++);
puts(*s1);
}
我从主要调用函数如下:
char *str = NULL;
str_cat(&str, " World!");
问题是当我试图到达s1的末尾时,但它没有正确递增。
谢谢!
答案 0 :(得分:2)
您的函数假定s2
可以附加在s1
的末尾。因此s1
应足够大,以容纳s2
。
您将s1
作为NULL传递并取消引用NULL指针,这是未定义的行为。
在你的情况下,确实没有必要传递字符指针的地址。
答案 1 :(得分:1)
*(s1++); /* go to the end of string1*/
这会增加char**
,并且取消引用操作不会执行任何操作。你想增加指向char*
,所以你需要
(*s1)++;
(类似于s2
。)
但是,您可能并不真的想要更改调用者中的指针,因此您应该使用临时变量
char *temp = *s1;
并将其递增以查找第一个字符串的结尾,或者,首先更好地传递char*
。
当然,你应该只用指向实际以0结尾的字符串的方式调用它。
答案 2 :(得分:1)
您的代码有未定义的行为
您正在写入一个指向无效内存的指针。 str
并未指向指向NULL
的任何有效内存。
你有责任str
指向一个有效且足够大的内存来保存你要复制到它的内容,如果不是结果是一个未定义的行为和一个非标准的符合程序,这意味着任何行为是可能的。
答案 3 :(得分:1)
这就是我所拥有的。
char * strcat (char *dest, const char *src)
{
char *dp;
char *sp = (char *)src;
if ((dest != NULL) && (src != NULL))
{
dp = &dest[strlen(dest)];
while (*sp != '\0')
{
*dp++ = *sp++;
}
*dp = '\0';
}
return dest;
}