问答题 函数ReadDat()实现从IN.DAT文件中读取一篇英文文章并存入字符串数组xx中。请编写函数StrOR(),其函数的功能是:以行为单位,依次把字符串中所有小写字母o左边的字符串内容移到该串的右边,然后把小写字母o删除,余下的字符串内容移到已处理字符串的左边,之后,把已处理的字符串仍按行重新存入字符串数组xx中。最后main()函数调用函数WriteDat(),把结果xx输出到OUT.DAT文件中。
例如, 原文: n any field. Yu can create an index
you have the correct record.
结果: n any field. Yu can create anindex
rd. yuhavethe crrect rec
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
注意:部分源程序已经给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
#include<stdio.h>
#include<string.h>
#include<conio.h>
char xx[50][80];
int maxline=0; /*文章的总行数*/
int ReadDat(void);
void WriteDat(void);
void StrOR(void)


void main()

if(ReadDat())

printf("数据文件IN.DAT不能打开!/n/007");
return;

StrOR();
WriteDat();

int ReadDat(void)

FILE*fp;
int i=0;
char*p;
if((fp=fopen("IN.DAT","r"))==NULL)
return 1;
while(fgets(xx[i],80,fp)!=NULL)

p=strchr(xx[i],'/n');
if(p)
*p=0;
i++;

maxline=i;
fclose(fp);
return 0;

void WriteDat(void)

FILE *fp;
int i;
fp=fopen("OUT.DAT","W");
for(i=0;i<maxline;i++)

printf("%s/n",xx[i]);
fprintf(fp,"%s/n",xx[i]);

fclose(fp);


【正确答案】void StrOR(void)
int i,j,k;
char bur[80];
for(i=0;i(maxline;i++) /*循环以遍历英文文章的每一行*/
j=strlen(xx[i])-1; /*求出当前行最后一个字符的位置*/
/*从最后一个字符往前循环遍历当前行,直到碰到小写字母'0'或到行首*/
while(xx[i][j]!='0'&&j>=0)
j--;
if(j<0) /*如果j<0说明找到行首也没发现一个'0'*/
continue; /*则当前行不用操作,去下一行*/
/*找到字母'0',用字符串结束标志0(或写成'/0')替换之,使该行一分为二*/
xx[i][j]=0;
strcpy(buf,&xx[i][j+1]); /*将后半截字符串复制到缓存行buf中*/
/*从第1个字符开始循环遍历前半截字符串*/
k=j=0;
while(xx[i][j])
/*循环往后遍历,找出第1个小写字母'0'的位置或到达字符串末尾*/
while(xx[i][j]!='0'&&xx[i][j])
j++;
if(!xx[i][j]) /*如果!xx[i][j]为真,说明已到达字符串末尾*/
/*将找过的这段字符串连接到buf中已存字符串的末尾并跳出循环*/
strcat(buf,&xx[i][k]);
break;
}
/*如果找到了字母'0',用0替换之以分割出找过的这段字符串*/
xx[i][j]=0;
/*将找过的这段字符串连接到buf中已存字符串的末尾*/
strcat(buf,&xx[i][k]);
/*从下一个位置开始继续循环遍历剩下的字符串*/
j++;
k=j;
}
/*执行到这里,当前行已遍历完毕,用操作结果覆盖掉原来内容*/
strcpy(xx[i],bur);
}
}
【答案解析】