函数Rdata()实现从文件IN.dat中读取一篇英文文章,存入到字符串数组string中,请编写函数CharRight(),其功能是:以行为单位把字符串中的最后一个字符的ASCII值右移4位后加倒数第二个字符的ASCII值,得到最后一个新的字符;倒数第二个字符的ASCII值右移4位后加倒数第三个字符的ASCII值,得到倒数第二个新的字符;依此类推,一直处理到第二个字符;第一个字符的ASCII值加原最后一个字符的ASCII值,得到第一个新的字符。得到的新字符分别存放在原字符串对应的位置上,最后已处理的字符串仍按行重新存入字符串数组string中。最后调用函数Wdata(),把结果string输出到文件OUT.dat中。
原始数据文件存放的格式是:每行的宽度均小于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 CharRight(void)
{
}
void main()
{ if (Rdata())
{ printf("数据文件IN.dat不能打开!\n\007");
return;
}
CharRight();
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);
}
试题答案及详解
【审题分析】分析题目可知,本题只要实现CharRight()函数的功能即可。CharRight()函数要实现的功能是:按“将字符的ASCII值右移4位并加上该字符前面的一个字符的ASCII值等到新的字符,然后存在原位”的替代关系,将字符串数组string中的字符全部替换。因此解答本题的关键在于读取字符串数组中的字符,然后转换成ASCII码值,最后进行替换运算。
【解题思路】这里我们通过for循环语句来实现读取字符串数组中的所有字符。当自变量i从0递增到maxline时,就完成了对一篇文章每一行的扫描。对一行的字符串数组,首先利用字符串函数strlen求出字符串数组string[i]的长度输给变量strl,把字符串中的最后一个字符赋给ch;然后在for循环语句中当自变量j从strl-1递减到0时,对每一个字符的ASCII值右移4位,右移4位的字符与其前一个字符相加,两者的和仍然存入字符串数组元素string[i][j]中;最后替换第一个字符时将其ASCII值与ch相加,得到第一个新的字符。
【参考答案】
void CharRight(void)
{ int i, j, strl;
char ch;
for (i=0; i<maxline; i++)
{ strl = strlen(string[i]);
ch = string[i][strl-1];
for (j=strl-1; j>0; j--)
{ string[i][j] >>= 4;
string[i][j] += string[i][j-1];
}
string[i][0] += ch;
}
}
【易错分析】字符的ASCII值右移4位,用表达式string[i][j] >>= 4表示。
【考点链接】字符的移位运算。
责任编辑:小草