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