问答题 函数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 main()
{
if (Rdata ())
{
printf("数据文件in.dat不能打开! \n\007");
return;
}
CharRight ();
Wdata ();
}
/*从文件in.dat中读取一篇英文文章,存入到字符串数组string中*/
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;
}
/*把结果string输出到文件out.dat中*/
void Wdata()
{
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);
}
【正确答案】
【答案解析】int i,j, strl;
char ch;
for(i=0;i<maxline; i++)
{
strl=strlen(string[i]); //计算文章第i行的长度
ch=string[i][strl-1]; //把文章第i行的最后一个字符赋给ch
/*从文章第i行的最后一个字符开始对每一个字符右移4位后再与其前一个字符相加得到一个新的字符,把新字符的值赋给原字符*/
for(j=strl-1; j>0; j--)
{
string[i][j]>>=4; //字符string[i][j]的ASCII值右移4位
string[i][j]+=string[i][j-1]; //字符string[i][j]与其前一个字符string[i][j-1]相加后再把它们的和值赋给字符string[i][j]
}
/*第i行的最后一个字符string[i][strl-1]与第一个字符string[i][0]相加的和赋给第一个字符string[i][0]*/
string[i][0]+=ch;
} [解析] 以行为单位,新字符串中每个字符的ASCII码值等于该位置上的原字符ASCII码值的二进制右移4位后加其前一个字符的ASCII码值。
①定义整型循环变量i、j和表示字符串长度的整型变量strl,以及字符局部变量ch。
②在第一层for循环中,循环变量i从0开始,依次递增直到其值等于maxline,在循环体中,利用库函数strlen()求得字符串string[i]的长度,把此值赋给变量strl。把字符串string[i]的最后一个字符string[i][std-1]赋给字符变量ch,暂时保存起来。在第二层for循环中,循环变量j从str-1开始,依次递减直到其值小于或等于0,在循环体中,字符string[i][j]的ASCII码值右移4位,然后再与字符string[i][j-1]的ASCII码值相加的和保存到字符string[i][j]中。当退出第二层for循环后,把第i行的第一个字符string[i][0]与最后一个字符ch的值相加,保存在string[i][0]中。