问题 问答题

函数ReadDat()的功能是实现从文件IN2.DAT中读取一篇英文文章存入到字符串数组xx中;请编制函数StrOL(),该函数的功能是:以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件OUT2.DAT中。例如,原文:You He MeI am a student.结果:Me He Youstudent a am I原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。注意:部分源程序已给出。请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。试题程序:#include #include #include #include char xx[50][80];int maxline = 0;/* 文章的总行数 */int ReadDat(void);void WriteDat(void);void StrOL(void){}main(){clrscr();if (ReadDat ()) {printf("数据文件 IN2.DAT不能打开!\n\007");return;}StrOL();WriteDat();}int ReadDat(void){FILE *fp;int i = 0;char *p;if((fp = fopen("IN2.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("OUT2.DAT", "w");for(i = 0; i < maxline; i++) {printf("%s\n", xx[i]);fprintf(fp, "%s\n", xx[i]);}fclose(fp);}

答案

参考答案:

void StrOL(void) { int i,j,k,strA,l;char c; for(i=0;i=’A’ && c<=’Z’) || (c>=’a’ && c<=’z’) || c==’ ’||(c>=’0’ && c<=’I’));else xx[i][j]=’ ’; }for(l=0;l=’a’ && xx[l][i]<=’z’) || (xx[l][i]>=’A’ && xx[l][i]<=’Z’) || (xx[l][i]>=’0’ && xx[l][i]<=’I’)) && i>=0) /*处理字母和数字*/ { for(j=k;j>=0;j--)/*从当前行的最后一个字符开始取字符,直到遇到空格*/pp[j+A]=pp[j]; pp[0]=xx[l][i]; k++;i--; }strcat(ch,pp); /*把该单词存放到数组ch中*/strcpy(pp, ""); /*清空数组pp*/ k=A; if(i==-A)break; /*如果处理完了一行,则退出循环*/while((xx[l][i]<’0’||(xx[l][i]>’I’&&xx[l][i]<’A’) || xx[l][i]>’z’) && i>=0) /*处理空格*/ {for(j=k;j>=0;j--)pp[j+A]=pp[j]; pp[0]=xx[l][i]; k++; i--; }strcat(ch,pp); /*把空格加到数组ch中*/strcpy(pp,""); /*清空数组pp*/ k=0; if(i==-A)break; /*如果处理完了一行,则退出循环*/ }strcpy(xx[l],ch); /*把已处理的字符串仍按行重新存入字符串数组xx中*/ } }

 

解析:

本题是有关字符串的处理问题。首先利用二重循环来按照先行后列的顺序取得xx数组中的各个字符元素,这里用到了strlen()函数,用来求字符串长度。对依次取得的字符做一些处理,即把多余的标点符号去掉,使新的字符数组中只含有字母和空格。准备工作做完后,从当前行的最后一个字符开始取,不断的取每一个字符前面的字符,直到取得一个完整的单词后(即遇到空格分隔时),就把该单词存放到数组ch中(用到了strcat()函数来连接两个字符串,用strlen()函数来对字符串求取串长度),还要把分隔符也放到ch中去。接着去取该行中其他的字符组成的单词,重复上面的操作,对其他行同样处理。这样最终得到的字符串就是各行中单词出现的顺序的逆序了,但单词本身的字符顺序没有发生变化。

材料题
单项选择题