【真题1】 给定程序的功能是将在字符串s 中出现、而未在字符串t 中出现的字符 形成一个新的字符串放在u 中,u 中字符按原字符串中字符顺序排列,不去掉重复字 符。 例如:当s="112345",t="2467"时,u 中的字符串为"1135"。 #include < stdio.h > #include < string.h > void fun (char *s,char *t, char *u) { int i, j, sl, tl; sl = strlen(s); tl = strlen(t); for (i=0; i< sl; i++) { for (j=0; j< tl; j++) /************found************/ if (s[i] == t[j]) ___1___ ; if (j >=tl) /************found************/ *u++ = ___2___; } /************found************/ ___3___ = '\0'; } main() { char s[100], t[100], u[100]; printf("\nPlease enter string s:"); scanf("%s", s); printf("\nPlease enter string t:"); scanf("%s", t); fun(s, t, u); printf("the result is: %s\n", u); } (2011年2月) 解析: 本题考核点为字符串的查找,赋值操作。 题中第一空填"break;":break 为跳出循环的语句。" if (s[i] == t[j]) break;"语句是指当s[i] == t[j],即t[j]中的字符已经在字符指针s[j]所指向 的字符数组中存在时,循环就结束。 题中第二空填"s[i]":"*u++ = s[i];"是将s[i]赋给*u,然后u 加1。 题中第三空填"*u":"*u='\0';",字符串的最后一个字符应该是'\0'的。 答案:【1】break 【2】s[i] 【3】*u 【真题2】 给定程序modi.c 中函数 fun 的功能是:将s 所指字符串中出现的、t1 所指子串全部替换成t2 所指子字符串,所形成的新串放在w 所指的数组中。在此 处,要求t1 和t2 所指字符串的长度相同。 例如,当s 所指字符串中的内容为: "abcdabfab",t1 所指子串中的内容为:"ab",t2 所指子串中的内容为:"99"时, 结果,在w 所指的数组中的内容应:"99cd99f99"。 请改正程序中的错误,使它能 得出正确的结果。 注意:不要改动main 函数, #include < conio.h > #include < stdio.h > #include < string.h > int fun(char *s,char *t1,char *t2,char *w) { int i; char *p,*r,*a; strcpy(w,s); while(*w) {p=w;r=t1; /************found************/ while(r) if(*r==*p) {r++;p++;} else break; if (*r=='\0') { a=w;r=t2; /************found************/ while(*r){*a=*r;a++;r++} w+=strlen(t2); } else w++; } } main() { char s[100],t1[100],t2[100],w[100]; clrscr(); printf("\nPlease enter string S:");scanf("%s",s); printf("\nPlease enter substring t1:");scanf("%s",t1); printf("\nPlease enter substring t2:");scanf("%s",t2); if (strlen(t1)==strlen(t2)) { fun(s,t1,t2,w); printf("\nThe result is:%s\n",w); } else printf("Error:strlen(t1)!=strlen(t2)\n"); } (2011年2月) 解析: 本题着重考察C 语言指针的用法及常用算法。 在源程序中,r 为指向指针的指针变量,它存放的是指针变量的地址,题意中要 求对这个地址所指向的内容进行判断,所以须在地址前加上*,源程序"while ( r )"应改为"while(*r)"或相同作用的语句。 C 语言中,分号是语句的组成部分,各语句间以分号作为分隔。源程序"while ( *r ){ *a = *r; a++; r++ }"应改为"while(*r){*a=*r;a++;r++;}"或 相同作用的语句。 【真题3】 规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是: 除了字符串前后连续的*号之外,将串中其它*号全部删除。形参h 已指向字符串中 的第一个字母,形参p 已指向字符串中最后一个字母。在编写函数时,不得使用C 语言提供的字符串函数。 例如,字符串中的内容为: ****A*BC*DEF*G******,删除后,字符串中的内容应当是: ****ABCDEFG*******。在编写函数时,不得使用C 语言提供的字符串函数。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中的任何 内容,仅在函数fun 的花括号中填入你编写的若干语句。 #include < stdio.h > #include < conio.h > void fun(char *a,char *h,char *p) {……} main() { char s[81],*t,*f; printf("Enter a string:\n");gets(s); t=f=s; while(*t) t++; t--; while (*t=='*') t--; while (*f=='*') f++; fun(s,f,t); printf("The string after deleted:\n");puts(s); } (2011年2月) 解析: 本题的考核点是删除字符串中字符的算法。 解题思路:先将原串中从首字符开始的连续*放到一字符串数组中,再将从第一 个非*字符开始到串尾连续*之前的非*字符追加其后,接着将串尾的连续*后追 加,最后将新串中的字符放到原串中覆盖原串。 本评析仅供参考。 void fun(char *a,char *h,char *p) {char b[81],*x; int i=0,j=0; x=a; while (x< h) {b[j]=*x;x++;j++;} /*将原串中从首字符开始的连续*放到 一字符串数组b中*/ while (h< =p) if (*h!='*') {b[j]=*h;j++;h++;} /*将从第一个非*字符开始到串尾连续* 之前的非*字符追加在数组b中*/ else h++; p++; while (*p) {b[j]=*p;j++;p++;} /*将串尾的连续*后追加在数组b中*/ b[j]='\0';j=0; while (b[j]) { a[i]=b[j];i++;j++;} /*将字符串b中的所有字符复制到a字符串中覆盖 原串*/ a[i]='\0'; } |