问答题 下列程序的功能是:把s字符串中的所有字母改成该字母的下一个字母,字母z改成字母a。要求大写字母仍为大写字母,小写字母仍为小写字母,其他字符保持不变。请编写函数chg()实现程序功能,最后调用函数readwriteDAT(),读取IN.DAT中的字符串,并把结果输出到文件OUT.DAT中。
例如,s字符串中原有的内容为Mn 123Zxy,则调用该函数后,结果为No 123Ayz。
注意:请勿改动主函数main()和输入输出函数readwriteDAT()的内容。
【试题程序】
#include < stdio.h >
#include < string.h >
#include < stdlib.h >
#include <ctype.h >
#define N 81
void readwriteDAT();
void chg(char * s)
{
}
void main()
{
char a[N];
system ("CLS") ;
printf ("Enter a string:") ;
gets (a) ;
printf ("The original string is : ") ;
puts (a) ;
chg (a) ;
printf ("The string after modified: ") ;
puts (a) ;
readwriteDAT () ;
}
void readwriteDAT ()
{
int i ;
char a[N] ;
FILE * rf,* wf;
rf = fopen ("IN.DAT", "r") ;
wf = fopen ( "OUT. DAT", "w" ) ;
for(i =0;i <10;i ++)
{
fgets (a,81, rf) ;
chg (a) ;
fprintf (wf, "%s", a) ;
}
fclose (rf) ;
fclose (wf) ;
}
【正确答案】
【答案解析】void chg(char *s)
{
while(*s) /*若当前字符不是字符串结束符,则循环一直进行*/
if(*s=="z"||*s=="Z") /*将当前字母是"z"或者"Z"*/
{
*s-=25; /*则分别将其改成"a"或"A"*/
s++; /*取下一个字母*/
}
else if(*s>="a"&& *s<="y") /*若是小写字母,则改成该字母的下一个字母*/
{
*s+=1;
s++; /*取下一个字母*/
}
else if(*s>="A"&& *s<="Y") /*若是大写字母,则改成该字母的下一个字母*/
{
*s+=1;
s++; /*取下一个字母*/
}
else s++; /*取下一个字母*/
} [考点] 本题考查对字符串中字符的替换。考查的知识点主要包括:指针对字符串元素的访问,C语言循环结构,if判断结构,逻辑表达式。
[解析] 此题属于字符替换题型;分析题干要求,可以归纳出2个关键点:关键点1用指针实现对字符串元素的逐一访问;关键点2根据要求"把所有的小写字母改写成该字母的下一个字母"对字符进行替换。
接着分析具体的解决方法,首先通过指针的移动来实现对字符串的遍历,当指针指向位置的数值不为空,通过if判断结构和逻辑表达式来实现对所有字母的替换操作;其中对于字母"z"和"Z",要分别将其替换成字母"a"和"A"。
对字符数组进行逐元素访问;if判断结构中的逻辑表达式。