问答题 函数Rdata()实现从文件in.dat中读取一篇英文文章存入到字符串数组string中,请编写函数CharLeft(),其功能是:以行为单位把字符串中的所有字符的ASCII值左移4位,如果左移后,其字符的ASCII值小于等于32或大于100,则原字符保持不变,否则就把左移后的字符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 CharLeft()
{

}
void main()
{
if (Rdata ())
{
printf("数据文件in.dat不能打开! \n\007";
return;
}
CharLeft ();
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,str;
char ch;
for(i=0; i<maxline; i++)
{
str=strlen(string[i]); //计算文章第i行的长度
/*以行为单位把字符串中的所有字符的ASCII值左移4位,如果左移后,其字符的ASCII值大于32且小于等于100,就把左移后的字符ASCII值再加上原字符ASCII值,得到新的字符仍存入原字符串对应的位置上*/
for(j=0; j<str; j++)
{
ch=string[i][j]<<4; //字符string[i][j]的ASCII值左移4位,得到新的字符赋给ch
if(ch>32 && ch<=100) //如果新得到的字符ch的ASCII码值大于32且小于等于100
/*把左移后的字符ch的ASCII值加上原字符string[i][j]的ASCII值存入string[i][j]中*/
string[i][j]+=ch;
}
} [解析] 以行为单位把字符串中的所有字符的ASCII值左移4位,如果左移后,其字符的ASCII值小于等于32或大于100,则原字符保持不变,否则就把左移后的字符ASCII值再加上原字符ASCII值,得到新的字符仍存入原字符串对应的位置上。
①首先定义整型循环变量i、j和表示字符串长度的变量str,以及字符局部变量ch。
②在第一层for循环语句中,循环变量i从0开始,依次递增直到其值等于maxline,在循环体中,首先对字符串string[i]利用库函数strlen()求其长度,把此值赋给变量str。在第二层for循环语句中,循环变量j开始0,依次递增直到其值等于str,把字符string[i][j]的ASCII值左移4位后所得到字符赋给变量ch,再用if语句判断ch的值是否大于32并且小于等于100,如果成立,则把ch的值与string[i][j]的值相加,所得的新值保存在string[i][j]中。