函数Rdata()实现从文件IN.dat中读取一篇英文文章存入到字符串数组string中,请编写ConvertCharD()函数,其功能是:以行为单位把字符串中的所有小写字母改写成该字母的上一个字母,如果是字母a,则改写成字母z。大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变,最后把已处理的字符串仍按行重新存入字符串数组string中。最后调用函数Wdata(),把结果string输出到文件OUT.dat中。
例如,原文:Adb.Bcdza
abck.LLhj
结果:Aca.Bbcyz
zabj.LLgi
原始数据文件存放的格式是:每行的宽度均小于80个字符。
注意:部分源程序已经给出。请勿改动主函数main()、读数据函数Rdata()和输出数据函数Wdata()的内容。
#include <stdio.h>
#include <string.h>
#include <conio.h>
char string[50][80];
int maxline = 0; /* 文章的总行数 */
int Rdata(void);
void Wdata(void);
void ConvertCharD(void)
{
}
void main()
{ if (Rdata())
{ printf("数据文件IN.dat不能打开!\n\007");
return;
}
ConvertCharD();
Wdata();
}
int Rdata(void)
{ FILE *fp;
int i = 0;
char *p;
if ((fp = fopen("IN.dat", "r")) == NULL)
return 1;
while (fgets(string[i], 80, fp) != NULL)
{ p = strchr(string[i], '\n');
if (p)
*p = 0;
i++;
}
maxline = i;
fclose(fp);
return 0;
}
void Wdata(void)
{ FILE *fp;
int i;
fp = fopen("OUT.dat", "w");
for (i=0; i<maxline; i++)
{ printf("%s\n", string[i]);
fprintf(fp, "%s\n", string[i]);
}
fclose(fp);
}
试题答案及详解
【审题分析】分析题目可知,本题只要实现ConvertCharD()函数的功能即可。ConvertCharD()要实现的功能是:以行为单位把字符串中的所有小写字母改写成该字母的上一个字母,如果是字母a,则改写成字母z。大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变。最后把已处理的字符串仍按行重新存入字符串数组string中。因此解答本题的关键在于如何实现字符间的转换。
【解题思路】在for循环语中当自变量从0递增到maxline时,就完成了对一篇文章中每一行的字符进行判断。如果字符是a,就用字符z替换,否则如果字符是大于等于字符b,而小于等于字符z的ASCII码值,就对其ASCII码值减1。
【知识拓展】字符间的转换可以通过字母的ASCII值来实现,字母的ASCII值比上一个字母的的ASCII大1。
【参考答案】
void ConvertCharD(void)
{ int i;
char *pf;
for (i=0; i<maxline; i++)
{ pf = string[i];
while (*pf)
{ if (*pf == 'a')
*pf = 'z';
else if (*pf>='b' && *pf<='z')
*pf -= 1;
pf++;
}
}
}
【易错分析】判断字符的范围是否大于等于字符b而小于等于字符z;对于字符a,要单独进行处理。
【考点链接】C语言的for循环语句;字符的ASCII码值减1,就是其上一个字符的ASCII码值。
责任编辑:小草