如何仅使用指针返回整个字符串

时间:2018-09-25 09:44:59

标签: c arrays

我可以使用数组释放它,但是我想使其与指针一起工作。

 char *ft_strcpy(char *dest, char *src)
    {
        while (*src)
        {
            *dest = *src;
            dest++;
            src++;
           // return dest; i want 
        }
        *dest = '\0';
        return (dest);
    }

3 个答案:

答案 0 :(得分:2)

随着dest的增加,您正在丢失字符串。最后,dest指向一个保存'\0'的位置。您可以在dest仍指向分配的内存的开头时使用临时变量进行修改。

char *temp = dest;
while (*src)
{
    *temp = *src;
    temp++;
    src++;
}
*temp = '\0';
return (dest);

答案 1 :(得分:0)

您错过了指针用法的主要C原理。 当您使用dest ++时;您已将指针移至下一个字节。 如果您返回了最新的dest值-您将首先获得指向字符串末尾的指针。 另一个-您无需返回指针,所有指针操作都将数据更改为基本字符串,就像示例中的dest参数一样。 因此,当您完成函数后,可以将指针用作父函数中的dest参数,并看到更改完成。

如果您仍然希望使用返回指针构造函数,请执行以下操作:

char *ft_strcpy(char *dest, char *src)
    {
        char * retValue = dest;
        while (*src)
        {
            *dest = *src;
            dest++;
            src++;
           // return dest; i want 
        }
        *dest = '\0';
        return (retValue);
    }

然后,您可以获得指向字符串第一个字节的指针作为返回值。

答案 2 :(得分:0)

其他人也回答过要归还以下原始dest

char *ft_strcpy(char *dest, char *src) {
  char *original_dest = dest; // add
  while (*src) {
    *dest++ = *src++;
  }
  *dest = '\0';
  // return dest; 
  return original_dest; 
}

考虑字符串重叠的影响很有趣。以下内容将导致ft_strcpy()不断循环运行,直到代码在buf[]之外访问导致未定义行为,而不是"hehello"希望这样做。在这种情况下,while (*src) {循环覆盖了空字符

char buf[10] = "hello";
ft_strcpy(buf + 2, buf);

上述呼叫是病理性的,但允许进行。

标准strcpy()不允许通过restrict进行此类呼叫。简单地说,这意味着s1,s2不能重叠。

char *strcpy(char * restrict s1, const char * restrict s2); 

如何编写代码来处理重叠的字符串?

确定复制前 的长度。
复制memmove(),以处理重叠的缓冲区。

char *ft_strcpy2(char *dest, const char *src) {
  size_t sz = strlen(src) + 1;
  memmove(dest, src, sz);
  return dest; 
}

int main(void) {
  char buf[10] = "hello";
  puts(ft_strcpy2(buf + 2, buf));
  puts(buf);
}

输出

hello
hehello