练习 5-3 用指针实现函数strcat(s,t)将t指向的字符串复制到s指向的字符串的尾部。
2012-11-27 19:55
866 查看
1. 首先想到就是的将字符串s循环到‘\0’的前一个字符,然后将字符串t的地址给此时的s地址。
两个问题:
①这种s=t,是不对的,只是拷贝了指针,并没有进行字符串的复制?
②当执行语句 while(*s++);时,此时 *s='\0', 所以后面应该s--;或者这样写 while(*s) s++;
③ 注意调用mystrcat(s,t)时 ,不能定义为字符串常量(不能修改)
例: char str[ ]="hello";
不能定义为 char *str="hello".
2 .
3.利用strcpy来实现。
4.看到一道笔试题,编写strcat函数,最后问strcat能把strSrc的内容连接到strDest,为什么还要char
*类型的返回值?
不明白讲的什么意思?
5. 注意以下代码:
后来在网上看了别人博客,理解了一些,比如下面一段代码。
返回指针时,下面的代码会出现问题。
解析:之前在别的地方看到一个很形象的解释,就是你去旅游,觉得当地的一家酒店的饭菜很有特色,于是就记下了它的地址门牌号之类的(相当于指针),当你回去之后,也就是函数调用完毕,返回这个指针是没有问题的,你回去之后是依然可以看这个地址门牌号的,但是当一段时间再去上次旅游的地方,可能那家酒店已经不存在了,可能变成了一家理发店或者其他什么的
所以,当函数调用结束,指针所指向的内容是存放在栈的,会随着函数一起销毁的,但是指针还是存在的,只不过此时指针指向的内容不确定,所以结果是会出错的。
但是通过其他方法我们可以避免对指针返回的错误
比如延长指针的生命期,将其设置为静态变量,使其生命期延长至整个文件
或者设置成一个字符串的常量,让其存放在静态区中也是可以的
实现的代码如下
或 改为这样
两个问题:
①这种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; }
相关文章推荐
- 字符串拼接函数strcat的实现 while(*p++ !='\0')跳出后,p究竟指向哪? C/C++求职面试必备考点(三)
- 实现char * my_strcat(char * dest,char *src)函数. 返回: dest字符串的地址。 功能:将src指向的字符串追加到dest指向字符串的后面
- 【c语言】实现char * my_strcat(char * dest,char *src)函数. 返回: dest字符串的地址。 功能:将src指向的字符串追加到dest指向字符串的后面
- 【C语言】实现char * my_strcat(char * dest,char *src)函数. 返回: dest字符串的地址。 功能:将src指向的字符串追加到dest指向字符串的后面。
- 用字符指针作函数参数来实现字符串的复制
- 实现char * my_strcat(char * dest,char *src)函数. 返回: dest字符串的地址。 功能:将src指向的字符串追加到dest指向字符串的后面
- strcat,strcpy,strcmp,strlen4个常用字符串处理函数的数组与指针简单实现方法~
- 利用指向类成员函数的指针数组,实现更加隐蔽的接口
- C和指针之字符串简单实现 strcpy、strcat、strstr函数
- 在8位单片机上面实现字符串的拼接(单片机上strcat的函数的实现)
- 练习 3-2 编写一个函数escape(s, t),将字符串t复制到字符串s中,并在复制过程中将换行符、制表符等不可见字符分别转换为\n、\t等相应的可见的转义字符序列。要求使用swich语句。
- C++语言实现指向函数的指针数组实例
- 不调用C++/C字符串库函数,实现字符串复制函数strcpy
- 10.6 分别用字符数组和字符指针作函数参数两种方法编程实现在字符串每个字符间插入一个空格的功能
- c++实现字符串复制函数strcpy()
- C语言字符串相关库函数的实现strcpy、memcpy、strncpy、strcat、strncpy、memset、memcpy、strcpy
- C语言中字符串相关函数的实现(strcat strlen strcmp strcpy memcpy)
- 不调用字符串库函数,实现字符串复制函数
- 字符串处理函数的功能的实现(字符串连接,字符串复制)
- 编C语言程序:用自定义函数实现字符串处理函数strcat、 strcpy、strcmp、strlen和strlwr的功能