【真题1】 请补充main 函数,该函数的功能是:从一个字符串中截取前面若干个 给定长度的子字符串。其中,str1 指向原字符串,截取后的字符存放在str2 所指的 字符数组中,n中存放需截取的字符个数。 例如:当str1=“cdefghij”,然后输入 4,则str2=“cdef”。 注意:部分源程序给出如下。 请勿改动主函数main 和其他 函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。 试题 程序: #include < stdio.h > #include< conio.h > #define LEN 80 main() { char str1[LEN],str2[LEN]; int n,i; clrscr(); printf("Enter the string:\n"); gets(str1); printf("Enter the position of the string deleted:"); scanf(【1】); for(i=0;i< n;i++) 【2】 str2[i]='\0'; printf("The new string is:%s\n",【3】);} (2011年2月) 解析: 填空1:本题考查对标准输入函数scanf()的调用格式,由后面的程序 可以知道,变量n 保存了要截取的字符数,注意在n前面不要忘了取址符‘ &'。 填空2:截取前n 个字符,就是将字符串str1 的前n 个字符依次赋给字符串 str2 的前n 个字符。填空3:本题考查对标准输出函数printf()的调用格式, 根据题意,应输出截取后的字符串,即字符串str2。 答案:【1】″%d″,&n 【2】str2[i]=str1[i]; 【3】str2 【真题2】 给定程序modi.c 中,函数fun 的功能是:从N 个字符串中找出最长的 那个串,并将其地址作为函数值返回。各字符串在主函数中输入,并放入一个字符串 数组中。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main 函 数, #include < stdio.h > #include < string.h > #define N 5 #define M 81 /************found************/ fun(char (*sq)[M]) {int i; char *sp; sp=sq[0]; for(i=0;i< N;i++) if(strlen(sp)< strlen(sq[i])) sp=sq[i]; /************found************/ return sq; } main() {char str[N][M],*longest; int i; printf("Enter %d lines :\n",N); for (i=0;i< N;i++) gets(str[i]); printf("\nThe N string :\n",N); for (i=0;i< N;i++) puts(str[i]); longest=fun(str); printf("\nThe longest string:\n");puts(longest); } (2011年2月) 解析: 本题着重考察考生对C 语言中指针数组的定义以及函数返回值的掌握情 况。 本题中的第一个错误:指针数组定义错误,应将程序中的语句"fun(char (*sq)[M])"改为 "char *fun(char sq[N][M])"或”char *fun(char ( *sq)[M])”。 本题中的第二个错误:函数返回的应是字符串中最长那个串的地址,这个地址 是通过指针sp记录的,所以程序中的语句"return sq;"应改为"return sp;"或 相同作用的语句。 【真题3】 规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是: 使字符串中的尾部连续的*号不得多于n 个;若多于n 个,则删除多余的*号;若少 于或等于n 个,则什么也不做,字符串中间和尾部的*号不删除。 例如,字符串中的 内容为:****A*BC*DEF*G*******,若n 的值为4,删除后,字符串中的内容 应当是:****A*BC*DEF*G****;若n 的值为7,则字符串中的内容仍为: ****A*BC*DEF*G*******。n 的值在主函数中输入。在编写函数时,不得使用 C 语言提供的字符串函数。 注意:部分源程序存在文件prog.c 中。 请勿改动主函 数main 和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语 句。 #include < stdio.h > #include < conio.h > void fun(char *a,int n) {……} main() { char s[81];int n; printf("Enter a string:\n");gets(s); printf("Enter n: ");scanf("%d",&n); fun(s,n); printf("The string after deleted:\n");puts(s); } (2011年2月) 解析: 本题的考核点是删除字符串中字符的算法。 解题思路:先统计串尾连续字符的个数,若小于或等于指定的个数,什么也不 做,若多于指定的数,则删除多余的*,删除的方法是:通过一个循环先生成指 定个数个*放到一字符串中,再从串尾第一个非*字符开始至串首的字符追加其 后,最后将新串逆序放入到原串中覆盖原串。 本评析仅供参考。 void fun(char *a,int n) { char b[81]; int i=0,j=0,s=0,k,t=0; while (a[i]) {t++;i++;} i--; while (a[i]=='*') {s++;i--;} /*统计串尾连续字符的个数*/ if (s >n) /*判断字符串尾连续的*号个数是否大于n*/ { for (k=0;k< n;k++) {b[j]='*';j++;} while (i!=-1) {b[j]=a[i];j++;i--;} b[j]='\0'; i=0;j=j-1; while (j!=-1) { a[i]=b[j];i++;j--;} /*将字符串b中的所有字符复制到a字符串中覆盖原 串*/ a[i]='\0'; } } |