【真题1】 给定程序中,函数fun 的功能是:求出形参ss 所指字符串数组中最长字 符串的长度,其余字符串左边用字符*补齐,使其与最长的字符串等长。字符串数组 中共有M 个字符串,且串长< N。 请在程序的下划线处填入正确的内容并把下划线 删除,使程序得出正确的结果。不得增行或删行,也不得更改程序的结构! #include < stdio.h > #include < string.h > #define M 5 #define N 20 void fun(char (*ss)[N]) { int i, j, k=0, n, m, len; for(i=0; i< M; i++) { len=strlen(ss[i]); if(i==0) n=len; if(len >n) { /**********found**********/ n=len; ___1___=i; } } for(i=0; i< M; i++) if (i!=k) { m=n; len=strlen(ss[i]); /**********found**********/ for(j=___2___; j >=0; j--) ss[i][m--]=ss[i][j]; for(j=0; j< n-len; j++) /**********found**********/ ___3___='*'; }} main() { char ss[M][N]={"shanghai","guangzhou","beijing","tianjing","cchon gqing"}; int i; printf("\nThe original strings are :\n"); for(i=0; i< M; i++) printf("%s\n",ss[i]);
printf("\n"); fun(ss); printf("\nThe result:\n"); for(i=0; i< M; i++) printf("%s\n",ss[i]); } (2011年2月) 解析: 本题考查的是字符串中字符的插入。 在fun 函数中,第一个for 循环的作用是求出所有字符串中,长度最长的字符 串的长度n,并记下此字符串在数组中的下标k,故第一空应填k。在第二个 for 循环中,如果当前字符串不是最长字符串,则计算其长度len,并将从下标 0 到len 的字符向右移动n-len 位,故第二空为len;最后,再通过一个for 循 环语句在当前字符串前面补充len-n 个'*',故第三空应为ss[i][j]或其等效形 式。 答案:【1】“rb” 【2】s[j].sno 【3】fwrite 【真题2】 给定程序modi.c 中,函数fun 的功能是:利用插入排序法对字符串中 的字符按从小到大的顺序进行排序。插入法的基本算法是:先对字符串中的头两个元 素进行排序。然后把第三个字符插入到前两个字符中,插入后前三个字符依然有序; 再把第四个字符插入到前三个字符中,……。待排序的字符串已在主函数中赋予。 请 改正程序中的错误,使它能得出正确的结果。 注意:不要改动main 函数, #define N 80 #include "stdio.h" #include "string.h" void insert(char *aa) {int i,j,n; char ch; /************found************/ n=stlen(aa); for(i=1;i< n;i++) /************found************/ {c=aa[i]; j=i-1; while ((j >=0)&&(ch< aa[j])) { aa[j+1]=aa[j]; j--; } aa[j+1]=ch; } } main() { char a[N]="QWERTYUIOPASDFGHJKLMNBVCXZ"; int i; printf("The original string : %s\n",a); insert(a); printf("The string after sorting:%s\n\n",a); } (2011年2月) 解析: 本题的考核点是C语言的一些基本用法以及字符串函数的使用。 由题意可知,需通过字符串函数求出字符串aa的长度,求字符串的函数为 strlen。程序中的函数使用错误,应将"n=stlen(aa);"改为"n=strlen(aa);"。 C 语言中规定,使用变量之前应先对变量进行定义。程序中变量c未定义,不可 在程序中使用。由题意可知,这里应为变量ch,故"c=aa[i];"改为 "ch=aa[i];"或相同作用的语句。 【真题3】 编写一个函数 void fun(char p1[], char p2[]), 它的功能是: 实现两 个字符串的连接(不使用库函数strcat)。 例如,输入下面两个字符串: FirstString-- SecondString 程序输出: FirstString--SecondString 注意:部分 源程序存在文件prog.c 中。 请勿改动主函数main 和其它函数中的任何内容,仅在 函数fun 的花括号中填入你编写的若干语句。 #include < stdio.h > #include < conio.h > void fun(char p1[], char p2[]) {……} main() { char s1[80], s2[40] ; clrscr() ; printf("Enter s1 and s2:\n") ; scanf("%s%s", s1, s2) ; printf("s1=%s\n", s1) ; printf("s2=%s\n", s2) ; printf("Invoke fun(s1,s2):\n") ; fun(s1, s2) ; printf("After invoking:\n") ; printf("%s\n", s1) ; } (2011年2月) 解析: 本题的考核点是字符串的连接。 解题思路:1、定义两个字符型指针point1、point2,分别指向字符串p1 和 p2; 2、point1起始指向字符串p1 的第一个字符,通过循环,令其指向p1 串尾, 为未来的连接工作做好准备; 3、point2起始指向字符串p2 的第一个字符,通过循环,不断将指针指向p2 的下一个字符; 4、将point2 指向的字符通过指针point1 逐一连接在字符串p1 末尾; 5、连接完毕后,将指向字符串p1 末尾的指针point1 指向'0',以保证指针不 越界。 解法一: void fun(char p1[], char p2[]) { char *point1,*point2; /*定义两个字符型指针point1、point2*/ point1=p1; /*将字符型指针point1 指向字符串p1 的第一个字符*/ point2=p2; /*将字符型指针point2 指向字符串p2 的第一个字符*/ while(*point1!=NULL) point1++; /*通过循环,令point1 指向p1 串尾, 为未来的连接工作做好准备*/ /*通过循环将point2 指向的字符通过指针point1逐一连接在字符串p1 末尾 */ while(*point2!=NULL){ *point1=*point2; point1++; point2++; } *point1=NULL; /*将指向字符串p1 末尾的指针point1 指向'0',以保证指针 不越界*/ } 解法二: /* 注:第一个for()循环用于让i 成为第一个字符串的结束符的下标,要注意在 个for()后要有一个分号否则出错。第二个for()的作用是将第二个字符串一 个一个字符依次放到第一个字符串的未尾。此外,还要注意最后一定要有 p1[i]='\0';来给字符串加上结束符*/ void fun(char p1[],char p2[]) { int i,j; for(i=0;p1[i];i++); for(j=0;p2[j];j++) p1[i++]=p2[j]; p1[i]='\0'; } |