我可以使用数组释放它,但是我想使其与指针一起工作。
char *ft_strcpy(char *dest, char *src)
{
while (*src)
{
*dest = *src;
dest++;
src++;
// return dest; i want
}
*dest = '\0';
return (dest);
}
答案 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