设计一个函数指针,完成字符串的相加并返回相加后字符串的地址
方式一(不推荐,总是会忘记free掉内存):
#include#include #include char * catstr(char * s1,char * s2); int main(){ char s1[] = "123456"; char s2[] = "67890"; char *str = NULL; printf("before:str = 0x%xn",str); str = catstr(s1,s2); printf("after:str = 0x%xn",str); printf("%s",str); free(str); //将malloc分配的存储空间释放掉 return 0; } char * catstr(char * s1,char * s2){ char * str, *p; int length = strlen(s1) + strlen(s2) +1; //长度加1是为了存放' ' str = (char *) malloc(length * sizeof(char)); memset(str,0,length * sizeof (char)); p = str; //p指针和str指针同时指向分配的连续存储空间的首元素 while(*s1){ *p++ = *s1++; //等价于 *p = *s1; p++ ; s1++; } while(*s2){ *p++ = *s2++; //等价于 *p = *s2; p++ ; s2++; } *p = ' '; return str; }
拷贝的含义
free后
str还是指向原来的内存,但是存储空间的内容已经被系统清理掉了。
方式二:(比较安全)
好处:静态数组,不需要free。会自动释放内存,让系统回收。
两个数组都是在主程序中分配的,子程序共用数组。
#include#include #include char * catstr(char * s1,char * s2); int main(){ char s1[30] = "123456"; char s2[] = "67890"; char *str = NULL; str = catstr(s1,s2); //catstr(s1,s2)也可以 printf("%s",str); return 0; } char * catstr(char * s1,char * s2){ char *p; p = s1 + strlen(s1); //p指向s1结束的位置,即s1字符串‘ ’ while(*s2){ *p++ = *s2++; //等价于 *p = *s2; p++ ; s2++; } *p = ' '; return s1; }
遗留:
1.“拷贝”:
可以把赋值理解为复制,而非剪切
2.第二种方式改成用户输入数组
这是可以成功运行的。
#include#include #include char * catstr(char * s1,char * s2); int main(){ int len1,len2; printf("请输入字符串1和字符串2的大小:"); scanf("%d %d",&len1,&len2); char s1[len1],s2[len2];//创建字符串等长度输入后创建 printf("请输入字符串1:"); getchar(); gets(s1); // scanf("%s", s1);//输入字符串可以这样,其中s1不用加& // for (int i = 0; i < len1; ++i) { // scanf("%d",&s1[len1]);//这一行应有两个错误,自己找找 // } printf("请输入字符串2:"); gets(s2); // for (int j = 0; j < len2; ++j) { // scanf("%d",&s2[len2]);//这一行也应有两个错误,自己找找 // } char *str = NULL; str = catstr(s1,s2); //catstr(s1,s2)也可以 printf("%s",str); return 0; } char * catstr(char * s1,char * s2){ char *p; p = s1 + strlen(s1); //p指向s1结束的位置,即s1字符串‘ ’ while(*s2){ *p++ = *s2++; //等价于 *p = *s2; p++ ; s2++; } *p = ' '; return s1; }
我第一次写的,失败。
#include#include #include char * catstr(char * s1,char * s2); int len1,len2; int main(){ char s1[len1],s2[len2]; printf("请输入字符串1和字符串2的大小:"); scanf("%d %d",&len1,&len2); printf("请输入字符串1:"); for (int i = 0; i < len1; ++i) { scanf("%d",&s1[len1]); } printf("请输入字符串2:"); for (int j = 0; j < len2; ++j) { scanf("%d",&s2[len2]); } char *str = NULL; str = catstr(s1,s2); //catstr(s1,s2)也可以 printf("%s",str); return 0; } char * catstr(char * s1,char * s2){ char *p; p = s1 + strlen(s1); //p指向s1结束的位置,即s1字符串‘ ’ while(*s2){ *p++ = *s2++; //等价于 *p = *s2; p++ ; s2++; } *p = ' '; return s1; }
请教了同学才运行成功。
请教懒猫老师,发截图时还有不少错误。。啊啊啊啊啊啊啊啊啊!好难受!!我为什么不检查检查再发过去呢!!
question:
s1一定要足够大,我在这里定义的是实际的大小,也并没有让s1的长度变大,但是还能够编译运行。
只能说你的编译器语法检查太宽松了,明显的错误也不报错。



