问答题
函数ReadDat()实现从文件in.dat中读取一篇英文文章存入到字符串数组xx中;请编制函数StrOR(),其函数的功能是:以该文章中的行为单位依次扫描一行字符串中的小写字母o,每次将小写母o的左右字符串部分作交叉换位,即左边字符串移到小写字母o的右边,而原先右边的则反之,并把小写母o删除,依次直至这一行中的小写母o处理完,之后把己处理的字符串仍按行重新存入字符串数组xx中。
最后main()函数调用函数WriteDat()把结果xx输出到文件out.dat中。
例如原文:you have the correct record.
第1个o:u have the correct record.y
第2个o:rrect record.yu have the c
第3个o:rd.yu have the crrect rec
提示:对于每一行字符串数组处理有如下一种递归调用算法可供参考:
查找字符串中首个小写字母"o"的位置;没有找到"o",则结束递归调用;找到"o",则按题意对字符串进行处理,形成新的字符串,然后返回,继续进行递归调用。
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#include <stdio.h>
#include <string.h>
char xx[50] [80];
int maxline=0; /*文章的总行数*/
int ReadDat (void);
void WriteDat(void);
void StrOR(void)
{
}
void main()
{
if (Readmat ())
{
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;
}
/*把结果xx输出到文件out.dat中*/
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);
}
【正确答案】
【答案解析】int i;
char before[80],after[80],*p;
/*对文章的每行字符串进行处理*/
for(i=0; i<maxline;i++)
{
while(1)
{
p=strchr(xx[i], "o"); //定位字母o在字符串xx[i]的位置
if(p!=NULL) //如果在字符串xx[i]中查找到了字母o的位置
{
strcpy(after,xx[i]+(p-xx[i]+1)); //把字母o后的字符串拷贝到字符串after中
*p=0; //删除字母o
strcpy(before,xx[i]); //把字母o前的字符串拷贝到字符串before
strcpy(xx[i],after); //把字符串after拷贝到字符串xx[i]
strcat(xx[i],before); //字符串xx[i]与字符串before相连接
}
else //如果在字符串xx[i]中没有查找到字母o的位置
break; //退出循环语句
}
}
[解析] 以行为单位,依次把字符串中所有小写字母o左边的字符串内容移到该串的右边存放,然后把小写字母o删除,余下的字符串内容移到已处理字符串的左边存放。
①定义循环变量i和字符数组before[80]、after[80]及字符指针变量p。
②在for循环语句中,循环变量i从0开始,依次递增直到其值等于maxline,在循环体中,利用while循环语句一直执行如下的操作,调用库函数strchr()定位字母o在字符串xx[i]中第一次出现的位置p。如果p非空,说明在此字符串中找到了字母o,对于xx[i]有字母o的情况,从字符串xx[i]的第xx[i]+(p-xx[i]+1)字符开始,直到字符的结尾,调用字符串拷贝函数strcpy()把字母o后面的字符串拷贝到字符数组after[80]中,然后把*p的值设置为0,删除字母o,调用字符串拷贝函数strcpy()把字符串xx[i]拷贝到字符数组before[80]中,调用字符串拷贝函数strcpy()把字符数组after[80]的值拷贝到xx[i],再调用字符串连接函数strcat()把xx[i]与before[80]相连接,实现字母o前后字符串的互换。如果p为空,说明在xx[i]中没有字母o,则退出while循环。进入下一行字符串的处理。