请问这个模拟实现strcat函数中为啥结果是hello而不是hello world,哪里出错了
char* my_strcat(char* dest, char* src)
{
char* ret = dest;
assert(dest && src);
while (*dest++)
{
;
}
while (*dest++=*src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
这个循环条件会将指针增加到目标字符串的末尾,但它也会多增加一次,使其指向字符串末尾的空字符。然后,在下一个循环中,源字符串将从空字符开始复制到目标字符串中,从而覆盖它。
while (*dest)
{
dest++;
}
验证:
#include <stdio.h>
#include <assert.h>
#include <string.h>//src是要被追加的 不能变所以加const1
char *my_strcat(char *dest,const char* src){
assert(dest!=NULL);//两种写法都可以
assert(src);//加NULL更有体现
//1.找到目的字符串\0位置
char *ret=dest;
while(*dest!='\0'){
dest++;
}
//2.追加
while(*dest++=*src++){
;
}return ret;
}
int main(){
char arr1[]="hello";
char arr2[]="world";
my_strcat(arr1,arr2);
printf("%s\n",arr1);}
/*
//遇到\0结束
char arr1[]="hello";
char arr2[]="wo\0 rld";
strcat(arr1,arr2);
printf("%s",arr1);
}*/
char *strcat( char * destination, const char * source );
在你的实现中,可能没有删除dest原来末尾的"\0",导致拼接的字符串不是预期的结果。你可以尝试先在dest字符串末尾找到"\0"的位置,然后从该位置开始复制src的字符串,最后在dest新的末尾加上"\0"来表示字符串结束。
下面是一种实现方式:
char *my_strcat(char *dest, const char *src) {
int dest_len = strlen(dest);
int i;
for (i = 0; src[i] != '\0'; i++) {
dest[dest_len + i] = src[i];
}
dest[dest_len + i] = '\0'; // 添加字符串结束标志
return dest;
}
注意,在调用my_strcat函数时,dest必须已经足够长,能够容纳src的字符串。如果不确定长度,可以使用动态内存分配函数malloc来分配一个足够大的字符串。例如:
char *dest = (char *)malloc(strlen("hello") + strlen(" world") + 1);
strcpy(dest, "hello");
my_strcat(dest, " world");
printf("%s\n", dest);
free(dest); // 记得释放内存
这样就可以得到预期的输出"hello world"。