解题思路:
不调用库函数,实现字符串连接需要自己编写的有
①:求字符串长度函数
int stringlen_(char *l)/*求字符串长度*/ { int length=0; while(l[length]!='\0') { length++; } return length; }
②:字符串的连接函数
char *link_string(char *a,char *b)/*连接字符串*/ { int len_a=stringlen_(a); int len_b=stringlen_(b); if(len_a+len_b>=max)/*若连接后长度大于100,即大于等于101,则重分配空间*/ a=(char *)realloc(a,(len_a+len_b+1)*sizeof(char)); for(int i=stringlen_(a),j=0;j<=len_b;j++)/*这里j<=len_b,是因为把b中'\0'也一回存到a里*/ a[i++]=b[j]; return a; /*这里因为重分配空间后,之前a指向的空间可能 被释放,新空间地址返回给a,但是这里的a是形参,与主函数里的a指针不一样,主函数里的a还指向那个被 释放的空间,所以出错*//*所以a指针还是要返回的*/ }
③:字符串的输出函数
void out_putS(char *a)/*输出字符串*/ { int i=0; while(a[i]!='\0') { printf("%c",a[i]); i++; } printf("\n"); return; }
注意事项:
不可以这样写
void link_string(char *a,char *b)/*连接字符串*/ { int len_a=stringlen_(a); int len_b=stringlen_(b); if(len_a+len_b>=max)/*若连接后长度大于100,即大于等于101,则重分配空间*/ a=(char *)realloc(a,(len_a+len_b+1)*sizeof(char)); for(int i=stringlen_(a),j=0;j<=len_b;j++)/*这里j<=len_b,是因为把b中'\0'也一回存到a里*/ a[i++]=b[j]; } /*若把上面的字符串连接函数改乘这样不对,我是这样理解的,这里因为重分配空间后,之前a指向的空间可能 被释放,新空间地址返回给a,但是这里的a是形参,与主函数里的a指针不一样,主函数里的a还指向那个被 释放的空间,所以出错*//*所以a指针还是要返回的*/
1)若要这样写的话要这样写
void link_string(char **a,char *b)/*连接字符串*/ { int len_a=stringlen_(*a); int len_b=stringlen_(b); if(len_a+len_b>=max)/*若连接后长度大于100,即大于等于101,则重分配空间*/ *a=(char *)realloc(*a,(len_a+len_b+1)*sizeof(char)); for(int i=stringlen_(*a),j=0;j<=len_b;j++)/*这里j<=len_b,是因为把b中'\0'也一回存到a里*/ (*a)[i++]=b[j]; /*把a定义为指向指针的指针,这样主函数里面的a的指向也会随空间分配的改变而改变*/ }
2)对应程序(参考代码1)
#include<stdio.h> #include<malloc.h> #define max 101 void link_string(char **a,char *b);/*连接字符串*/ int stringlen_(char *l);/*求字符串长度*/ void out_putS(char *a);/*输出字符串*/ int main() { char *a=(char*)malloc(max*sizeof(char)); char *b=(char*)malloc(max*sizeof(char)); while(scanf("%s",a)!=EOF) { scanf("%s",b); link_string(&a,b); out_putS(a); } free(a); free(b); return 0; } /*----------------------------------------------------------*/ int stringlen_(char *l)/*求字符串长度*/ { int length=0; while(l[length]!='\0') { length++; } return length; } /*----------------------------------------------------------*/ void link_string(char **a,char *b)/*连接字符串*/ { int len_a=stringlen_(*a); int len_b=stringlen_(b); if(len_a+len_b>=max)/*若连接后长度大于100,即大于等于101,则重分配空间*/ *a=(char *)realloc(*a,(len_a+len_b+1)*sizeof(char)); for(int i=stringlen_(*a),j=0;j<=len_b;j++)/*这里j<=len_b,是因为把b中'\0'也一回存到a里*/ (*a)[i++]=b[j]; } /*----------------------------------------------------------*/ void out_putS(char *a)/*输出字符串*/ { int i=0; while(a[i]!='\0') { printf("%c",a[i]); i++; } printf("\n"); return; }
参考代码)2:
#include<stdio.h> #include<malloc.h> #define max 101 char *link_string(char *a,char *b);/*连接字符串*/ int stringlen_(char *l);/*求字符串长度*/ void out_putS(char *a);/*输出字符串*/ int main() { char *a=(char*)malloc(max*sizeof(char)); char *b=(char*)malloc(max*sizeof(char)); while(scanf("%s",a)!=EOF) { scanf("%s",b); a=link_string(a,b); out_putS(a); } free(a); free(b); return 0; } /*----------------------------------------------------------*/ int stringlen_(char *l)/*求字符串长度*/ { int length=0; while(l[length]!='\0') { length++; } return length; } /*----------------------------------------------------------*/ char *link_string(char *a,char *b)/*连接字符串*/ { int len_a=stringlen_(a); int len_b=stringlen_(b); if(len_a+len_b>=max)/*若连接后长度大于100,即大于等于101,则重分配空间*/ a=(char *)realloc(a,(len_a+len_b+1)*sizeof(char)); for(int i=stringlen_(a),j=0;j<=len_b;j++)/*这里j<=len_b,是因为把b中'\0'也一回存到a里*/ a[i++]=b[j]; return a; } /*----------------------------------------------------------*/ void out_putS(char *a)/*输出字符串*/ { int i=0; while(a[i]!='\0') { printf("%c",a[i]); i++; } printf("\n"); return; }
别忘点赞哦-.-
0.0分
3 人评分
简单的a+b (C语言代码)浏览:594 |
【出圈】 (C语言代码)浏览:590 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:400 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1015 |
C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:702 |
剪刀石头布 (C语言代码)浏览:1519 |
链表数据求和操作 (C语言代码)浏览:1035 |
简单的a+b (C语言代码)浏览:444 |
C二级辅导-公约公倍 (C语言代码)浏览:1325 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:522 |