2006年9月全國等級考試三級c語言上機題庫(四)

★☆題目4(無憂id 24題 上機題庫id 9 字元串單詞倒置題)

函式readdat()實現從檔案in.dat中讀取一篇英文文章存入到字元串數組xx中,請編制函式strol(),其函式的功能是:以行為單位對行中以空格或標點符號為分隔的所有單詞進行倒排。最後把已處理的字元串(應不含標點符號)仍按行重新存入字元串數組xx中,最後調用函式writedat()把結果xx輸出到檔案out6.dat中。
例如:原文:you he me
i am a student.
 結果:me he you
student a am i
原始數據檔案存放的格式是:每行的寬度均小於80個字元,含標點符號和空格。
部分源程式存在檔案prog1.c中。
請勿改動主函式main()、讀數據函式readdat()和輸出數據函式writedat()的內容。
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>

char xx[50][80];
int maxline=0;/*文章的總行數*/

int readdat(void);
void writedat(void);

/*在無憂及上機題庫版模擬系統中都通過測試(輸入檔案句末有標點的在輸出檔案中句前有空格*/
void strol(void)
{ int i,j,k,s,m,strl;
char str[80];
for(i=0;i<maxline;i++)
{ strl=strlen(xx[i]);
memset(str,0,80); /*初始化這字元串數組str*/
s=k=0;
for(j=strl-1;j>=0;j--) /*從當前字元串尾部開始向前倒序循環,實現題意要求的倒排*/
{ if(isalpha(xx[i][j])) k++; /*如果當前字元是字母a~z或a~z,則k加一*/
else { for(m=1;m<=k;m++) /*否則將長度為k的單詞順序存入到字元串數組str中,s值加1*/
str[s++]=xx[i][j+m];
k=0; /*將k值清0,以方便下一個單詞的長度計數*/
}
if(!isalpha(xx[i][j])) str[s++]=' '; /*如果當前字元不是字母a~z或a~z,則以空格代之存入到字元串數組str中,s值加一*/
}
for(m=1;m<=k;m++) /*此時的k值為當前字元串中第一個單詞的長度,但在上一個for循環中沒能存入到字元串數組str中,所以在這裡將其存入到str中*/
str[s++]=xx[i][j+m];
str[s]='\0'; /*在當前行尾加0以標記此行的結束*/
strcpy(xx[i],str); /*將倒排好的當前字元串重新存回到當前行xx中*/
}
}

void main()
{
clrscr();
if(readdat()){
printf("數據檔案in.dat不能打開!\n\007");
return;
}
strol();
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;

clrscr();
fp=fopen("out6.dat","w");
for(i=0;i<maxline;i++){
printf("%s\n",xx[i]);
fprintf(fp,"%s\n",xx[i]);
}
fclose(fp);
}