【真题1】 函数int MySearch(char *str, char *s)的功能是:统计字符串s 在字 符串str 中出现的次数。 例如,若输入字符串"12 123 12345"和"23",则应输出2(表示字符串"23"在字符 串"12 123 12345"中出现了两次)。若输入字符串"33333"和"33",则应输出4 (表示字符串"33"在字符串"33333"出现了四次)。 请勿改动主程序main、函数WriteData 和函数compute 中的任何内容,仅在函数 MySearch 中的横线处填入适当的内容并删除横线 #include < conio.h >#include < stdio.h >#include < string.h >int MySearch( char* str, char* s ) { char* p; int n =0; for( ; *str; ) if( ( p = strstr( str, s ) ) != NULL ) { n++; str=p+1; } else ____[1]____; return(____[2]____); } main() { char str1[81], str2[21]; printf("\nPlease enter 2 line character strings:\n"); gets(str1); gets(str2); printf( "\n\n\"%s\" are(is) appeared in \"%s\" %d times\n", str2, str1, MySearch(str1, str2)); compute(); } /* 以下部分与考生答题无关, 考生不必阅读, 但不得进行任何修改 */ WriteData(int num) { FILE *fp ; fp=fopen("dat22.dat","w"); fprintf(fp,"%d",num); fclose(fp); } compute() { char str1[81], str2[21], ch; FILE *fp; int num ; fp=fopen("c9670203.in","r"); fgets(str1, 80, fp); str1[strlen(str1)-1] = 0 ; fgets(str2, 20, fp); ch = str2[strlen(str2)-1] ; if(ch == '\n') str2[strlen(str2)-1] = 0 ; fclose(fp); num=MySearch(str1, str2); WriteData(num); } (2011年2月) 解析: 本题的考核点是c 语言中指针和循环语句的使用。 解题思路:当字符串str 中没有字符串s,而此时str 指针又没有指向串最后一 个字符时,str++,继续循环,直到遇到字符串结束标志'\0',结束循环。n 是 一个计数器,用以统计字符串s在字符串str 中出现的次数,函数结束时应将其 返回。 int MySearch( char* str, char* s ) { char* p; int n =0; for( ; *str; ) if( ( p = strstr( str, s ) ) != NULL ) { n++; str=p+1; } else str++; return( n ); } 答案:【1】str++ 【2】n 【真题2】 给定程序modi.c 的功能是:删除w数组中下标为k 的元素中的值。程 序中, 调用了getindex、arrout 和arrdel三个函数,getindex 用以输入所删元 素的下标,函数中对输入的下标进行检查,若越界,则要求重新输入,直到正确为 止。arrout 用以输出数组中的数据,arrdel进行所要求的删除操作。 请改正程序中的语法错误,使它能得出正确的结果。 注意:不要改动 main 函数, #include "conio.h" #include "stdio.h" #define NUM 10 /************found************/ arrout ( int w, int m ) { int k; /************found************/ for (k = 0; k < m; k++) printf ("%d " w[k]); printf ("\n"); } arrdel ( int *w, int n, int k ) { int i; for ( i = k; i < n-1; i++ ) w[i] = w[i+1]; n--; return n; } getindex( int n ) { int i; do { printf("\nEnter the index [ 0< = i< %d ]: ", n ); scanf ("%d",&i ); } while( i < 0 || i > n-1 ); return i; } main( ) { int n, d, a[NUM]={21,22,23,24,25,26,27,28,29,30}; n = NUM; clrscr(); printf ("Output primary data :\n"); arrout ( a, n ); d = getindex( n ); n = arrdel ( a, n, d ); printf ("Output the data after delete :\n"); arrout( a, n ); } (2011年2月) 解析: 本题的考核点是C语言中函数入口参数的用法和常用函数的使用。 从主函数中可以看出,w 是一个字符串,因此在arrout函数的参数表中应将w 改为字符指针或字符数组,即把"arrout(int w,int m )"语句改为"arrout(int *w, int m )"或相同作用的语句。 printf 函数的一般格式为:printf( 格式控制,输出表列);,因此, "printf("%d"w[k]); "应改为"printf("%d",w[k]); "或相同作用的语句。 【真题3】 下列给定程序中,函数fun()的功能是:删除字符串s 中所有空白字符(包括Tab 字 符、回车符及换行符)。输入字符串时用"#"结束输入。 试题程序: #include < string.h >#include < stdio.h >#include < ctype.h >fun(char *p) { ……} main() {char c,s[80]; int i=0; printf("Input a string: "); c=getchar(); while(c!=’#’) { s[i]=c;i++;c=getchar();} s[i]=’\0’; fun(s); puts(s); } (2011年2月) 解析: fun(char *p) { int i, t; char c[80]; for(i=0,t=0;p[i];i++) if(!isspace(*(p+i))) c[t++]=p[i]; c[t]='\0'; strcpy(p,c); } |