字符指针指向字符数组_数组指针的用法

字符指针指向字符数组_数组指针的用法字符指针数组的使用替换人名-题目分析上篇介绍了指针数组的使用,本篇将使用字符指针数据来完成一个具体题目的实现。如果对字符指针数组还不是很了解的同学,可以先去上篇学习一下。本节中的题目是一个程序填空题,只能修改//start和//

字符指针数组的使用–替换人名-题目分析   上篇介绍了指针数组的使用,本篇将使用字符指针数据来完成一个具体题目的实现。如果对字符指针数组还不是很了解的同学,可以先去上篇学习一下。本节中的题目是一个程序填空题,只能修改//start和//end中间的部分。因此,需要先看懂原始代码,然后在原始代码的基础上完成题目。废话不多说,先上题目。   题目内容:   本题在一批人名中,找到要修改的人名,将其替换为新输入的人名。   本题首先输入n个人名(带空格),然后输入待查找的人名和待替换人名,将找到的人名换为新人名。   输入示例:   4   zhou zhiruo   zhang wuji   zhao min   li xunhuan   zhao min   lin shiyin   3   sun xiaohong   a fei   yang yan   tian ji   shangguan fei   输出示例:   修改后:   zhou zhiruo   zhang wuji   lin shiyin   li xunhuan   no person!   要求在原有代码之上完成。   原有代码:   一、程序分析:   (1)变量定义:n,i,len分别表示人的个数、循环变量和用来存储接收字符串的长度,old_name,new_name,temp_str数组分别存储需要修改的人名,新的人名,pc为一个char类型指针,pname数组是一个指针数组,用来存储n个同学姓名字符串的地址;   (2) while(scanf(“%d”,&n)!=-1)用于控制多组数据处理,循环内的两个getchar();语句用于处理n后面的回车。锐格系统中回车是由\r\n两个字符组成,而大家平时练习的Codeblocks中回车是\n,一个字符,因此在调试程序时注意注释掉其中一个。   (3) for(i=0;i<n;i++)用于接收n个人名,对于每个人名处理的过程是先将人名存入temp_str临时数组,再调用strlen函数temp_str中字符串的长度存入len,然后利用malloc函数动态申请len+1个字节的空间,并把新申请内存的地址存入指针数组pname[i],最后把temp_str中的字符串拷贝至pname[i]指向的内存,也就是新申请的内存中。   (4) gets(old_name); 和gets(new_name); 用于接收待修改人名和新人名。输入示例1执行完到此后内存中数据存储示意图如下图所示:
字符指针指向字符数组_数组指针的用法
字符指针指向字符数组_数组指针的用法   程序运行到gets(new_name);行时的内存示意图   (5)pc=modi_name(n,pname,old_name);这里的modi_name就是需要大家自行编写的函数,在不清楚这个函数的功能时,先分析函数的原型,由于pc是char *类型,因此函数的返回值类型一定是char *,函数接收的实参n,pname,old_name的数据类型分别为int,char *[],char *,因此,这里可以得出函数modi_name的原型是:char * modi_name(int n,char *pname[], char * old_name),具体它的功能需要根据下文来进行分析,这里仅知道它接收指针数组pname地址,其中素的个数n,待修改的人名,返回一个char *,也就是一个字符串的地址,但是功能具体实现什么还需要往下分析。mo_name函数的返回值存入pc变量中。   (6)if(pc==NULL) printf(“no person!\n”);这里说明如果pc为NULL,则打印no person!也就是没有找到要修改的人名;else部分for语句中i从0到n,其中遍历了指针数组pname,如果pname[i]的值等于pc,就把pname[i]的值修改为new_name,这样pname[i]素的值就修改为new_name,也就是它指向了存储新人名的数组,然后打印pname[i]指向的字符串。由此,可以看出pc中存储的就是待修改的人名字符串的首地址。那么,可以分析得出函数mode_name实现的功能是遍历pname指针数组n个指针素,判断各个素指向的字符串是否与old_name待修改的人名相同,如果相同就返回它指向的字符串的首地址,相对于上图总的例子而言,它返回的是“zhaomin\0”的地址,也就是pname[i]的值(此时,i=2,pname[i]=2800)。如果遍历完pname数组后仍然没有找到待修改的人名,则返回NULL。   二、程序实现   根据上面的程序分析,modi_name函数的定义应该是:   程序执行完后内存示意图如下图所示:pname[2]不再指向2800(zhao min\0),转而指向new_name数组(1032,红色显示的指向箭头)。
字符指针指向字符数组_数组指针的用法
字符指针指向字符数组_数组指针的用法   三、反思   从上面的程序分析和运行后内存的情况可以看出,该程序至少存在以下错误:   (1)程序中只能更新一个素,当存在n个人名中有重复,存在多个待修改的人名时只能修改一个,不能修改所有的;因为更新的代码“ if(pname[i]==pc) pname[i] = new_name;”语句中判断待修改的人名时使用的是判断与pc是否相同,不管在modi_name函数中返回的是哪一个字符串的首地址,但是它只能返回一个。因此,不能更新所有的。如果想更新所有的待修改人名,这里应该用if(strcmp(pname[i],old_name)==0)来进行判断;   (2)更新的方法不好,因为new_name是一个数组,其内存在栈上由系统自动分配,不是pname指针数组中其他素都存储的动态内存地址,因此,用pname[i] = new_name;语句更新带来至少带来两个bug,一是由于没有释放旧人名所占据的内存(2800开头的内存),造成内存泄露,二是程序最后在用free释放内存时会带来系统错误。而本程序中由于main函数的最后没有释放动态分配内存,所以没有错误没有显示出来。因此,应该对更新的方法进行修改,为新人名的存储更新内存。具体函数实现见稍后代码。   (3)main函数的最后没有释放动态分配内存。建议编写一个函数释放pname指针数组中各素指向的内存。   因此,本程序中人名的更新可以由两个函数完成,一个search函数用于查找在pname指针数组指向的字符串中是否存在待修改人名,如果存在返回1,不存在返回0,不需要返回地址,因为返回的地址也没有什么具体的作用,一个update函数用户完成在pname指针数组中查找待修改人名old_name,如果存在就释放旧人名占据的空间,申请新的空间,并将new_name中存储的字符串拷贝至动态内存空间中。内存的释放可以编写一个freeCharStarArray函数。具体代码如下:

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/64307.html

(0)
上一篇 2024年 8月 27日
下一篇 2024年 8月 27日

相关推荐

关注微信