第37套:
给定程序中,函数fun的功能是:在形参ss所指字符串数组中,查找含有形参substr所指子串的所有字符串并输出,若没找到则输出相应信息。ss所指字符串数组中共有N个字符串,且串长小于M。程序中库函数strstr(s1, s2)的功能是在 s1串中查找s2子串,若没有,函数值为0,若有,为非0。
 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。
 注意:源程序存放在考生文件夹下的BLANK1.C中。
 不得增行或删行,也不得更改程序的结构!
 给定源程序:
#include <stdio.h> 
#include <string.h> 
#define N 5 
#define M 15 
void fun(char (*ss)[M], char *substr) 
{ int i,find=0; 
for(i=0; i< __1__ ; i++) 
if( strstr(ss[i], __2__) != NULL ) 
{ find=1; puts(ss[i]); printf("\n"); } 
if (find==__3__) printf("\nDon't found!\n"); 
} 
main() 
{ char x[N][M]={"BASIC","C langwage","Java","QBASIC","Access"},str[M]; 
int i; 
printf("\nThe original string\n\n"); 
for(i=0;i<N;i++)puts(x[i]); printf("\n"); 
printf("\nEnter a string for search : "); gets(str); 
fun(x,str); 
} 
解题思路:
 本题是根据给定的字符串数组中查找指定的字符串,如果存在,则显示。
 第一处:利用for循环,从几个字符串中进行查找,程序中已经给定了N个字符串,所以应填:N。
 第二处:查找子串,子串由形参substr传递,所以应填:substr。
 第三处:试题要求,若没有找到,函数值为0,所以应填:0。
给定程序MODI1.C中函数fun的功能是:求三个数的最小公倍数。
 例如,给主函数中的变量x1、x2、x3分别输入15 11 2,
 则输出结果应当是:330。
 请改正程序中的错误,使它能得出正确结果。
 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
 给定源程序:
#include <stdio.h> 
fun(int x, y, z ) 
{ int j,t ,n ,m; 
j = 1 ; 
t=j%x; 
m=j%y ; 
n=j%z; 
while(t!=0||m!=0||n!=0) 
{ j = j+1; 
t=j%x; 
m=j%y; 
n=j%z; 
} 
return i; 
} 
main( ) 
{ int x1,x2,x3,j ; 
printf("Input x1 x2 x3: "); scanf("%d%d%d",&x1,&x2,&x3); 
printf("x1=%d, x2=%d, x3=%d \n",x1,x2,x3); 
j=fun(x1,x2,x3); 
printf("The minimal common multiple is : %d\n",j); 
} 
解题思路:
 第一处: 函数中形参的定义不正确,应改为:fun(int x,int y, int z)。
 第二处: 程序中三个数的最小公倍数是用j处理的,所以应返回j的值。
假定输入的字符串中只包含字母和号。请编写函数fun,它的功能是:只删除字符串前导和尾部的号,串中字母之间的号都不删除。形参n给出了字符串的长度, 形参h给出了字符串中前导号的个数,形参e给出了字符串中最后号的个数。在编写函数时,不得使用C语言提供的字符串函数。
 例如,字符串中的内容为:ABCDEFG*****,删除后,字符串中的内容应当是:ABCDEF*G。
 注意: 部分源程序在文件PROG1.C文件中。
 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
 给定源程序:
#include <stdio.h> 
void fun( char *a, int n,int h,int e ) 
{ 
} 
main() 
{ char s[81],*t,*f; int m=0, tn=0, fn=0; 
printf("Enter a string:\n");gets(s); 
t=f=s; 
while(*t){t++;m++;} 
t--; 
while(*t=='*'){t--;tn++;} 
while(*f=='*'){f++;fn++;} 
fun( s , m,fn,tn ); 
printf("The string after deleted:\n");puts(s); 
NONO(); 
} 
解题思路:
 本题是考察对字符串的操作。
- 求出字符串的长度。
- 利用循环把字符串中字符按要求仍存放在原字符串首址开始的位置上。
 参考答案:
void fun( char *a, int n,int h,int e ) 
{ 
char *p=a ; 
int j=0,len=0; 
while(*p) {p++; len++;} 
while(j<len-h-e) { 
a[j]=a[h+j]; 
j++; 
} 
a[j]=0; 
}