练习 5-3 用指针实现函数strcat(s,t)将t指向的字符串复制到s指向的字符串的尾部。

来源:互联网 发布:ubuntu 更新版本 编辑:程序博客网 时间:2024/05/16 19:50


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 bookchar* 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;}




 

原创粉丝点击