strcat使用指针

时间:2012-11-20 12:03:39

标签: c

  

可能重复:
  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的末尾时,但它没有正确递增。

谢谢!

4 个答案:

答案 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;
}