栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

※【C】设计指针函数完成字符串的相加

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

※【C】设计指针函数完成字符串的相加

设计一个函数指针,完成字符串的相加并返回相加后字符串的地址

方式一(不推荐,总是会忘记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的长度变大,但是还能够编译运行。

只能说你的编译器语法检查太宽松了,明显的错误也不报错。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/348233.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号