1、字符串(二)及答案解析(总分:100.00,做题时间:90 分钟)一、程序填空(总题数:4,分数:64.00)1.给定程序中,函数 fun()的功能是求 ss 所指字符数组中长度最短的字符串所在的行下标,作为函数值返回,并把其串长放在形参 n 所指变量中。ss 所指字符数组中共有 M 个字符串,且串长N。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的 BLANK1.C 中。不得增行或删行,也不得更改程序的结构。#includestdio.h#includestring.h#define M 5#define N 20int fun(cha
2、r(*ss)N,int *n)int i,k=0,len=N;/*found*/for(i=0;i (1) ;i+)len=strlen(ssi);if(i=0)*n=len;/*found*/if(len (2) *n)*n=len;k=i;/*found*/return (3) ;main()char ssMN=“shanghai“,“guangzhou“,“beijing“,“tianjing“,“chongqing“;int n,k,i;printf(“/nThe original strings are:/n“);for(i=0;iM;i+)puts(ssi);k=fun(ss,pr
3、intf(“/nThe length of shortest string is:%d/n“,n);printf(“/nThe shortest string is:%s/n“,ssk);(分数:16.00)填空项 1:_2.给定程序中,函数 fun()的功能是将 s 所指字符串中的所有数字字符移到所有非数字字符之后,并保持数字字符串和非数字字符串原有的先后次序。例如,形参 s 所指的字符串为 def35adh3kjsdf7,执行结果为 defadhkjsdf3537。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的 BLANK1.C 中。
4、不得增行或删行,也不得更改程序的结构。#includestdio.hvoid fun(char *s)int i,j=0,k=0;char t180,t280;for(i=0;si!=/0;i+)if(si=00 (1) ;else t1k+=si;t2j=0;t1k=0;/*found*/for(i=0;ik;i+) (2) ;/*found*/for(i=0;i (3) ;i+)sk+i=t2i;main()char s80=“ba3a54j7sd567sdffs“;printf(“/nThe original string is:%s/n“,s);fun(s);printf(“/nThe
5、 result is:%s/n“,s);(分数:16.00)填空项 1:_3.给定程序中,函数 fun()的功能是在形参 s 所指字符串中的每个数字字符之后插入一个*号。例如,形参 s 所指的字符串为 def35adh3kjsdf7,执行结果为 def3*5*adh3*kjsdf7*。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的 BLANK1.C 中。不得增行或删行,也不得更改程序的结构。#include stdio.hvoid fun(char *s)int i,j,n;for(i=0;si!=/0;i+)/*found*/if(si
6、=0 (1) si=9)n=0;/*found*/while(si+1+n!= (2) )n+;for(j=i+n+1;ji;j-)/*found*/sj+1= (3) ;sj+1=*;i=i+1;main()char s80=“ba3a54cd23a“;printf(“/nThe original string is: %s/n“,s);fun(s);printf(“/nThe result is:%s/n“,s);(分数:16.00)填空项 1:_4.给定程序中,函数 fun()的功能是统计形参 s 所指字符串中数字字符出现的次数,并存放在形参 t 所指的变量中,最后在主函数中输出。例如,
7、形参 s 所指的字符串为 abcdef35adgh3kjsdf7,输出结果为 4。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的 BLANK1.C 中。不得增行或删行,也不得更改程序的结构。#includestdio.hvoid fun(char *s,int *t)int i,n;n=0;/*found*/for(i=0; (1) !=0;i+)/*found*/if(si=0/*found*/(3) ;main()char s80=“abcdef35adgh3kjsdf7“;int t;printf(“/nThe original s
8、tring is:%s/n“,s);fun(s,printf(“/nThe result is:%d/n“,t);(分数:16.00)填空项 1:_二、程序修改(总题数:2,分数:36.00)5.给定程序 MODI1.C 中函数 fun()的功能是:求出 s 所指字符串中最后一次出现 t 所指子字符串的地址,通过函数值返回,在主函数中输出从此地址开始的字符串;若未找到,则函数值为 NULL。例如,当字符串中的内容为”abcdabfabcdx”,t 中的内容为”ab”时,输出结果应是 abcdx。当字符串中的内容为”abcdabfabcdx”,t 中的内容为”abd”时,则程序输出未找到信息 n
9、ot be found!。请改正程序中的错误,使它能得出正确的结果。注意:不要改动 main()函数,不得增行或删行,也不得更改程序的结构。#include stdio.h#include string.hchar *fun(char *s, char *t)char *p, *r, *a;/*found*/a=Null;while (*s)p=s;r=t;while (*r)/*found*/if (r=p)r+;p+;else break;if (*r=/0)a=s;s+;return a;main()char s100, t100, *p;printf(“/nPlease enter s
10、tring S:“); scanf(%s“,s);printf(“/nPlease enter substring t:“); scanf(“%s“,t);p=fun(s,t);if(p) printf(/nThe result is:%sha“,p);else printf(“/nNot found !/a“);(分数:18.00)_6.给定程序 MODI1.C 中函数 fun()的功能是:将 p 所指字符串中每个单词的最后一个字母改成大写(这里的“单词”是指由空格隔开的字符串)。例如,若输入”I am a student to take the examination.”,则应输出”I a
11、M A studenT tO takE thE examination.”。请修改程序中的错误之处,使它能得出正确的结果。注意:不要改动 main()函数,不得删行,也不得更改程序的结构。#includectype.h#includestdio.h#includestring.hvoid fun(char *p)int k=0;for(; *p;p+)if(k)/*found*/if(p=)k=0;/*found*/*(p)=toupper(*(p-1)elsek=1;main()char chrstr64;int d;printf(“/nPlease enter an English sen
12、tence within 63 letters:“);gets(chrstr);d=strlen(chrstr);chrstrd=;chrstrd+1=0;printf(“/n/nBefore changing:/n %s“,chrstr);fun(chrstr);printf(“/nAfter changing:/n%s“,chrstr);(分数:18.00)_字符串(二)答案解析(总分:100.00,做题时间:90 分钟)一、程序填空(总题数:4,分数:64.00)1.给定程序中,函数 fun()的功能是求 ss 所指字符数组中长度最短的字符串所在的行下标,作为函数值返回,并把其串长放在形
13、参 n 所指变量中。ss 所指字符数组中共有 M 个字符串,且串长N。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的 BLANK1.C 中。不得增行或删行,也不得更改程序的结构。#includestdio.h#includestring.h#define M 5#define N 20int fun(char(*ss)N,int *n)int i,k=0,len=N;/*found*/for(i=0;i (1) ;i+)len=strlen(ssi);if(i=0)*n=len;/*found*/if(len (2) *n)*n=len;
14、k=i;/*found*/return (3) ;main()char ssMN=“shanghai“,“guangzhou“,“beijing“,“tianjing“,“chongqing“;int n,k,i;printf(“/nThe original strings are:/n“);for(i=0;iM;i+)puts(ssi);k=fun(ss,printf(“/nThe length of shortest string is:%d/n“,n);printf(“/nThe shortest string is:%s/n“,ssk);(分数:16.00)填空项 1:_ (正确答案:
15、(1)M (2) (3)k)解析:解析 函数 fun()的功能是求 ss 所指字符数组中长度最短的字符串所在的行下标。求最短字符串所在的下标,一般假设第一个字符串的长度最短 min。如果用 k 记录最短字符串的下标,开始时min=strlen(ss0),k=0;然后逐个比较其他字符串长度,如果字符串 ssi长度比 min 小,则将 min 赋值为这个字符串长度,k=I;如此便可求得最短字符串和最短字符串所在的下标位置。第一空:循环的目的是在 M 个字符串中寻找长度最短的字符串,因此循环变量 i 从 0 变化到 M-1,故第一空处应为“M”。第二空:*n 记录最小字符串的长度,由审题分析可知,字
16、符串 ssi长度比 min 小,则交换最小长度值和下标位置,故第二空处应为“”。第三空:变量 k 记录了最小字符串的下标位置,函数的返回值是最短的字符串所在的行下标,故第三空处应为“k”。考点 字符串处理,排序。2.给定程序中,函数 fun()的功能是将 s 所指字符串中的所有数字字符移到所有非数字字符之后,并保持数字字符串和非数字字符串原有的先后次序。例如,形参 s 所指的字符串为 def35adh3kjsdf7,执行结果为 defadhkjsdf3537。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的 BLANK1.C 中。不得增行或
17、删行,也不得更改程序的结构。#includestdio.hvoid fun(char *s)int i,j=0,k=0;char t180,t280;for(i=0;si!=/0;i+)if(si=00 (1) ;else t1k+=si;t2j=0;t1k=0;/*found*/for(i=0;ik;i+) (2) ;/*found*/for(i=0;i (3) ;i+)sk+i=t2i;main()char s80=“ba3a54j7sd567sdffs“;printf(“/nThe original string is:%s/n“,s);fun(s);printf(“/nThe resu
18、lt is:%s/n“,s);(分数:16.00)填空项 1:_ (正确答案:(1)j+ (2)si=t1i (3)j)解析:解析 函数 fun()的功能是将 s 所指字符串中的所有数字字符移到所有非数字字符之后。在 fun()函数中,先将非数字字符和数字字符分别存储在数组 t1 和 t2 中,然后将数组 t2 和 t1 按照非数字字符在前、数字字符在后的顺序放在字符串 s 中。第一空:如果 si是数字字符,则将 si保存在 t2 数组中,同时变量 j 自增,准备下次保存数字字符,故第一空处应为“j+”。第二空:在语句“for(i=0;ik;i+)”中,i 从 0 开始,说明将非数字字符存储到
19、 s 字符串的前面,非数字字符保存在 t1 数组中,因此第二空处应为“si=t1i”。第三空:循环“for(i=0;i (3) ;i+)”是将数字字符保存在 s 字符串的后面,数字字符的个数为 j,因此这里是将 j 个数字字符保存在 s 字符串的后面,故第三空处应为“j”。考点 字符串处理。3.给定程序中,函数 fun()的功能是在形参 s 所指字符串中的每个数字字符之后插入一个*号。例如,形参 s 所指的字符串为 def35adh3kjsdf7,执行结果为 def3*5*adh3*kjsdf7*。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件
20、夹下的 BLANK1.C 中。不得增行或删行,也不得更改程序的结构。#include stdio.hvoid fun(char *s)int i,j,n;for(i=0;si!=/0;i+)/*found*/if(si=0 (1) si=9)n=0;/*found*/while(si+1+n!= (2) )n+;for(j=i+n+1;ji;j-)/*found*/sj+1= (3) ;sj+1=*;i=i+1;main()char s80=“ba3a54cd23a“;printf(“/nThe original string is: %s/n“,s);fun(s);printf(“/nThe
21、 result is:%s/n“,s);(分数:16.00)填空项 1:_ (正确答案:(1)”是求 si+1之后的字符数量,找到其后的字符数量之后便可以在“for(j=i+n+1;jI;j)”循环中移动后面的字符了,故 while 的条件是没有达到字符串结束位,n+,即第二空处应填“0”或“/0”。第三空:“for(j=i+n+1;jI;j)”循环是将数字字符后面的字符往后移动一位,从最后一个字符开始往后移动,故 sj+1=sj,即第三空处为“si”。考点 字符串处理,if 语句。4.给定程序中,函数 fun()的功能是统计形参 s 所指字符串中数字字符出现的次数,并存放在形参 t 所指的变
22、量中,最后在主函数中输出。例如,形参 s 所指的字符串为 abcdef35adgh3kjsdf7,输出结果为 4。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的 BLANK1.C 中。不得增行或删行,也不得更改程序的结构。#includestdio.hvoid fun(char *s,int *t)int i,n;n=0;/*found*/for(i=0; (1) !=0;i+)/*found*/if(si=0/*found*/(3) ;main()char s80=“abcdef35adgh3kjsdf7“;int t;printf(“
23、/nThe original string is:%s/n“,s);fun(s,printf(“/nThe result is:%d/n“,t);(分数:16.00)填空项 1:_ (正确答案:(1)si (2)9 (3)*t=n)解析:解析 函数 fun()的功能是统计形参 s 所指字符串中数字字符出现的次数。数字字符的判断是 si=0且 si=9,满足该条件后,计数变量加 1。搜索整个字符串,便得到数字字符出现的次数。第一空:循环终止条件是达到了字符串的尾部,字符串以“/0”(或 NULL)结束,故第一空处应为“si”。第二空:数字字符的判断是 si=0且 si=9,故第二空处应为“9”。
24、第三空:这里是将数字字符出现的次数存放在形参 t 里,n 记录了数字字符的个数,而形参 t 是指针变量,故第三空处应为“*t=n”。考点 if 语句,循环条件。二、程序修改(总题数:2,分数:36.00)5.给定程序 MODI1.C 中函数 fun()的功能是:求出 s 所指字符串中最后一次出现 t 所指子字符串的地址,通过函数值返回,在主函数中输出从此地址开始的字符串;若未找到,则函数值为 NULL。例如,当字符串中的内容为”abcdabfabcdx”,t 中的内容为”ab”时,输出结果应是 abcdx。当字符串中的内容为”abcdabfabcdx”,t 中的内容为”abd”时,则程序输出未
25、找到信息 not be found!。请改正程序中的错误,使它能得出正确的结果。注意:不要改动 main()函数,不得增行或删行,也不得更改程序的结构。#include stdio.h#include string.hchar *fun(char *s, char *t)char *p, *r, *a;/*found*/a=Null;while (*s)p=s;r=t;while (*r)/*found*/if (r=p)r+;p+;else break;if (*r=/0)a=s;s+;return a;main()char s100, t100, *p;printf(“/nPlease e
26、nter string S:“); scanf(%s“,s);printf(“/nPlease enter substring t:“); scanf(“%s“,t);p=fun(s,t);if(p) printf(/nThe result is:%sha“,p);else printf(“/nNot found !/a“);(分数:18.00)_正确答案:(1)a=NULL; (2)if(*r=*p)解析:解析 该题中 fun()函数的功能是求得字符串中某子串最后一次出现的地址。从已给定源程序的main()主函数开始入手,通过调用“p=fun(s,t);”语句求得 p 的地址,然后通过判断
27、p,判断串 s 中是否存在子串 t。第一个标识下语句“a=Null;”中的 Null 未定义。NULL 代表空值,但程序中写成了 Null,所以应改成“a=NULL;”。程序的主体是二重循环,其中外循环使指针 s 逐个指向字符串中的字符,直到遇到串结束符退出循环;内循环检查指针 p 与 r 所指字符串是否匹配。因为这里 p、r 是指针,如果使用判断表达式“if(r=p)”,那么比较的是地址,而题目要求比较它们所指的字符,所以应改为“if(*r=*p)”。考点 C 语言标识,变量的使用。6.给定程序 MODI1.C 中函数 fun()的功能是:将 p 所指字符串中每个单词的最后一个字母改成大写(
28、这里的“单词”是指由空格隔开的字符串)。例如,若输入”I am a student to take the examination.”,则应输出”I aM A studenT tO takE thE examination.”。请修改程序中的错误之处,使它能得出正确的结果。注意:不要改动 main()函数,不得删行,也不得更改程序的结构。#includectype.h#includestdio.h#includestring.hvoid fun(char *p)int k=0;for(; *p;p+)if(k)/*found*/if(p=)k=0;/*found*/*(p)=toupper(*
29、(p-1)elsek=1;main()char chrstr64;int d;printf(“/nPlease enter an English sentence within 63 letters:“);gets(chrstr);d=strlen(chrstr);chrstrd=;chrstrd+1=0;printf(“/n/nBefore changing:/n %s“,chrstr);fun(chrstr);printf(“/nAfter changing:/n%s“,chrstr);(分数:18.00)_正确答案:(1)if(*p=) (2)*(p-1)=toupper(*(p-1);
30、)解析:解析 本题中函数 fun()的功能是将每个单词的最后一个字母改成大写。解题思路:根据题干中“这里的单词是指由空格隔开的字符串”,可以归纳为主要是对字符串中空格字符的查找。第一个错误标识下的 if 语句应该是判断字符串中的字符是否是空格,根据“for(;*p;p+)”语句中for 循环条件中 p 的定义应该为字符型指针变量,*p 是取 p 所指存取单元的值,所以“if(p=)”应该改为“if(*p=)”。题干中要求是将每个单词的最后一个字母改成大写,所以它的位置应该是挨着空格的前一个字符,应该是指针 p 指向字符的前一个位置,“*p=toupper(*(p-1)”是将改动的值赋给了 p 所指的空格,所以应该改为“*(p-1)=toupper(*(p-1);”且语句末尾应有分号。考点 函数功能。