程序解读中的疑问

来源:百度知道 编辑:UC知道 时间:2024/05/25 13:31:15
函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数StrOL(),其函数的功能是:以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中,最后调用函数writeDat()
部分源程序存在文件prog1.c中。
?? 请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
??#include
??#include
??#include
??#include
??
??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);
?? s=k=0;
??for(j=strl-1;j>=0;j--)
?? { if(isalpha(xx[i][j])) k++;
?? else { for(m=1;m<=k;m++)
?? str[s++]=xx[i][j+m];
?? k=0;
?? }
?? if(!isalpha(xx[i][j]))
??str[s++]=' ';
?? }
??for(m=1;m<=k;m++)
?? str[s++]=xx[i][j+m];
??str[s]='\0';
?? strcpy(xx[i],str); }
??}
??
有谁可以帮我解释一下这几个fo

我在文本文件上写的,复制上来有点乱,看不清楚了。你可以把它拷贝到文本文件下面,整理一下,就会很清晰了。

void StrOL(void)
{
int i,j,k,s,m,strl; //i代表行,j代表列,k代表一次搜索中有多少个字母,s作为str[]的下标,m用于对目的串赋值,strl记录第i行字符串的长度;
char str[80]; //这是一个用来作中间变量的字符串;

for(i=0;i<MAXLINE;i++) //利用for循环,对所有行进行循环内的操作,i定义行。
?? {
strl=strlen(xx[i]); //取第i行字符串的长度,赋值给strl;
??memset(str,0,80); //memset(str,0,80)初始化str的值;
?? s=k=0; //初始化S和K的值;

?? for(j=strl-1;j>=0;j--) //j定义列,该循环用倒序对第i行中的字符进行处理;
?? { if(isalpha(xx[i][j])) //isalpha()函数对第i行第j列的字符是否为字母进行判别;
k++; //如果是字母,K++。则k记录的是到目前为止找到了多少个字母。
?? else //如果不是,
{
for(m=1;m<=k;m++) //那么此时K的值记录的应该是,直到最后一次判决isalpha()为真的时候有一共经历了多少个字母。
?? str[s++]=xx[i][j+m]; //将xx[i][j+m]的值赋予str[s++],就是把这中间经历的字母全部拷贝到str,
?? k=0; //且k置0 ,以便下一次记录;
?? }
?? if(!isalpha(xx[i][j]))
?? str