1

可能重复:
对此 c 函数 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);
 }

我从 main 调用函数如下:

char *str = NULL;
str_cat(&str, " World!");

问题是当我尝试到达 s1 的末尾时,但它没有正确递增。

谢谢!

4

4 回答 4

2

您的函数假定s2可以附加在s1. 所以s1应该大到可以容纳s2

s1作为 NULL 传递并取消引用 NULL 指针,这是未定义的行为。

在您的情况下,实际上也不需要传递字符指针的地址。

于 2012-11-20T12:06:24.297 回答
1
*(s1++); /* go to the end of string1*/

这增加了char**, 并且取消引用操作在那里什么都不做。你想增加指向的char*,所以你需要

(*s1)++;

(类似的s2。)

但是,您可能真的不想更改调用者中的指针,因此您应该使用临时变量

char *temp = *s1;

并增加它以找到第一个字符串的结尾,或者最好char*首先传递 a 。

当然,您应该只使用指向实际以 0 结尾的字符串的指针来调用它。

于 2012-11-20T12:05:19.797 回答
1

您的代码具有未定义的行为
您正在写入一个不指向有效内存的指针。str不指向它指向的任何有效内存NULL

您有责任str指向一个有效且足够大的内存来保存您正在复制的内容,如果不是,则结果是未定义的行为和不符合标准的程序,这意味着任何行为都是可能的。

于 2012-11-20T12:05:20.763 回答
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;
}
于 2012-11-20T12:21:21.200 回答