一、程序填空题1. 给定程序中,函数fun的功能是:在形参SS所指字符串数组中,查找含有形参substr所指子串的所有字符串并输出,若没找到则输出相应信息。ss所指字符串数组中共有N个字符串,且串长小于M。程序中库函数strstr(s1,s2)的功能是在s1串中查找s2子串,若没有,函数值为NULL,若有,为非NULL。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include<stdio.h>
#include<string.h>
#define N 5
#define M 15
void fun(char(*ss)[M],char*substr)
{int i,find=0;
/***********found***********/
for(i=0;i<______;i++)
/***********found***********/
if(strstr(ss[i],______)!=NULL)
{find=1;puts(ss[i]);printf("\n");}
/***********found***********/
if(find==______)
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);
}
(1)N (2)substr (3)0
[解析] 填空1:此处考查for循环语句中循环变量i的取值范围,题目指出共有N个字符串,所以i的取值范围为0~N-1。
填空2:strstr(s1,s2)的功能是在s1串中查找s2子串。题目要求在ss字符串数组中,查找substr所指的字符串,故应填substr。
填空3:此处使用if条件语句来判断查找结果,由printf("\nDon't found!\n")可知此处需填写没有找到的条件,即是find==0。
二、程序改错题1. 下列给定程序中,函数fun的功能是:将大写字母转换为对应小写字母之后的第5个字母;若小写字母为v~z,则使小写字母的值减21。转换后的小写字母作为函数值返回。例如,若形参是字母A,则转换为小写字母f;形参是字母w,则转换为小写字母b。
请改正函数fun中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include<stdio.h>
#include<ctype.h>
char fun(char c)
{
if(c>='A'&& c<='Z')
/**********found**********/
c=c-32;
if(c>='a'&& c<='u')
/**********found**********/
c=c-5;
else if(c>='v'&& c<='z')
c=c-21;
return c;
}
main()
{
char c1,c2;
printf("\nEnter a letter(A-Z):");
c1=getchar():
if(isupper(c1))
{
c2=fun(c1);
printf("\n k nThe letter %c change to%c\n",c1,c2);
}
else
{
printf("\nEnter(A-Z)!\n");
}
}
(1)c=c+32;
(2)c=c+5;
[解析] (1)从ASCII码值表中可以看出,小写字母的ASCII码值比对应大写字母的ASCII码值大32,所以大写字母转换成小写字母要加32。
(2)将大写字母转换成对应小写字母之后,再将其转换成其后面的第5个字母,所以要加5。
三、程序设计题1. 规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中的前导*号全部删除,中间和尾部的*号不删除。
例如,字符串中的内容为:*******A*BC*DEF*G****,删除后,字符串中的内容应当是:A*BC*DEF*G****。在编写函数时,不得使用C语言提供的字符串函数。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
给定源程序:
#include <stdio.h>
void fun(char*a)
{
}
main()
{ char s[81];
printf("Enter a string:\n");gets(s);
fun(s);
printf("The string after deleted:\n");puts(s);
}
void fun(char *a)
{
char *p=a;
while(*p=='*')p++; /*指针p指向字符串第一个字母*/
for(;*p!='\0'; p++, a++)
*a=*p; /*从第一个字母开始,其后的字符都放入指针a所指的字符串中*/
*a='\0'; /*在字符串最后加上字符串结束标识*/
}
[解析] 我们在此提供另一种解答方法。
#include<string.h>
void fun(char *a)
{ char *p=a;
while(*p=='*')p++;
strcpy(a,p);
}