[说明]
从文件in.dat中读取一篇英文文章存入到字符串数组xx中,以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中,最后把结果xx输出到文件OUT6.DAT中。
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
[函数]
#include<string.h>
#include<conio .h>
#include<ctype.h>
#include<stdio.h>
char xx[50][80];
int maxline = 0 ; /*文章的总行数*/
int ReadDat (void) ;
void WriteDat (void) ;
void StrOL(void)
char *p1,*p2,t [80];
int i;
for (i=0; i<maxline; i++)
p1=xx[i];t[0]=0;
while (*p1) p1++;
while (p1>=xx [i])
while (! isalpha (*p1) &&p1 ! =xx [i]) p1--;
p2 =p1;
while( (1) )p1--;
if (p1==xx [i])
if (isalpha (*p1) p1--;
else if (! isalpha (* (p1+1;)) break;
p2++;
(2) ;
strcat (t,p1+1) ;
strcat (t, " ") ;
strcpy (xx [i] ,t) ;
void main
if( (3) )
printf ("数据文件in.dat不能打开! \n\007") ;
return;
StrOL ();
writeDat ();
getch;
int ReadDat (void)
FILE *fp;
int i=0;
char *p;
if ((fp=fopen ("e:\\a\\\in.dat " , "r")) ==NULL) return 1;
while (fgets (xx [i] , 80, fp) ! =NULL)
p=strchr (xx [i] , ’\n’) ;
if(p)*p=0
i++ ;
maxline= (4) ;
fclose (fp);
return 0;
void WriteDat (void)
FILE *fp;
int i;
fp=fopen("e: \\a\\out6 .dat" ,"w");
for (i=0; i<( (5) ) ; i++)
printf("%s\n" ,xx [i]);
fprintf (fp, "%s\n", xx[i]);
fclose(fp);
参考答案:maxline
解析: 在主函数中首先调用函数ReadDat(),从文件in.dat中读取一篇英文文章存入到字符串数组xx中,所以空(3)应填入“ReadDat()”。用变量maxline表示文章的行数,所以空(4)应填入“i”。
函数StrOL()的功能是以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排,然后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中,采用的算法是先让两字符指针都指向串尾,然后使一指针(p1)往前移动,当出现不是字母时则表示在p1+1与p2之间是一个单词,并将该单词存入一变量(t1),最后将t1连接到新串中(t);接着再往前找第二个单词,依次类推,直到字符串头。for循环中的第一个while循环将字符指针移到串尾,在第二个while循环中,首先要去掉不是字母的字符,将p2也指向串尾,然后向前找一个单词及p1所指向的应为字母,且要保证仍然在本行,所以空(1)可填入“isalpha(*p1)&&p1!=xx[i]”(或等价形式),这样p1+1与p2之间是一个单词,要作字符串处理,p2加1,指向字符串结束标记,所以空(2)应填入“*p2=’\0’”或者“*p2=0”。
最后通过调用函数Writedat()把结果XX输出到文件中,空(5)为输入的行数,显然应填入"maxline”。