1. 首先想到就是的将字符串s循环到‘\0’的前一个字符,然后将字符串t的地址给此时的s地址。
两个问题:
①这种s=t,是不对的,只是拷贝了指针,并没有进行字符串的复制?
②当执行语句 while(*s++);时,此时 *s='\0', 所以后面应该s--;或者这样写 while(*s) s++;
③ 注意调用mystrcat(s,t)时 ,不能定义为字符串常量(不能修改)
例: char str[ ]="hello";
不能定义为 char *str="hello".
char* mystrcat(char* s, char* t)
{
char* p;
p = s;
while (*s++)
;
s = t; //不能将 字符串str2的首地址給 吗? 这样只拷贝了指针。
return p;
}
int main()
{
//char *str1 = "hello"; 字符串常量 不能修改
char str1[] = "hello";
char* str2 = "world";
printf("%s", strcat(str1, str2));
return 0;
}
2 .
//from answer book
char* strcat(char* s, char* t)
{
char* p;
p = s;
while (*s)
s++;
while (*s++ = *t++)
;
return p;
}
3.利用strcpy来实现。
//利用 strcpy函数来实现
char* strcat3(char* dest, char* src)
{
char* p = dest;
strcpy(dest+ strlen(dest), src);
return p;
}
4.看到一道笔试题,编写strcat函数,最后问strcat能把strSrc的内容连接到strDest,为什么还要char *类型的返回值?
不明白讲的什么意思?
5. 注意以下代码:
此外,注意如下代码:
char *Func(void)
{
char str[] = "hello world";
return str; //return语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁。
}
char *Func(void)
{
char *pstr = "hello world";//字符串常量存放在静态区
return pstr;
}
后来在网上看了别人博客,理解了一些,比如下面一段代码。
返回指针时,下面的代码会出现问题。
解析:之前在别的地方看到一个很形象的解释,就是你去旅游,觉得当地的一家酒店的饭菜很有特色,于是就记下了它的地址门牌号之类的(相当于指针),当你回去之后,也就是函数调用完毕,返回这个指针是没有问题的,你回去之后是依然可以看这个地址门牌号的,但是当一段时间再去上次旅游的地方,可能那家酒店已经不存在了,可能变成了一家理发店或者其他什么的
所以,当函数调用结束,指针所指向的内容是存放在栈的,会随着函数一起销毁的,但是指针还是存在的,只不过此时指针指向的内容不确定,所以结果是会出错的。
include <stdio.h>
char*GetMemory(void)
{
char p[]="hello world"; //
return p;
}
int main(void)
{
char *str=NULL;
str=GetMemory();
printf(str);
return 0;
}
但是通过其他方法我们可以避免对指针返回的错误
比如延长指针的生命期,将其设置为静态变量,使其生命期延长至整个文件
或者设置成一个字符串的常量,让其存放在静态区中也是可以的
实现的代码如下
#include <stdio.h>
char *GetMemory(void)
{
static char p[]="hello world";
return p;
}
int main(void)
{
printf("%s\n",GetMemory());
return 0;
}
或 改为这样
#include <stdio.h>
char *GetMemory(void)
{
char *p="hello world";
return p;
}
int main(void)
{
printf("%s\n",GetMemory());
return 0;
}