台湾霸道总裁电视剧:程序解读中的疑问

来源:百度文库 编辑:高校问答 时间:2024/05/04 05:47:17
函数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); }
??}
??
有谁可以帮我解释一下这几个for循环具体做的是哪些事吗??谢谢了!!
if(!isalpha(xx[i][j])) 和上面的那个
else { for(m=1;m<=k;m++)
?? str[s++]=xx[i][j+m];
?? k=0;
?? }
有什么区别吗?? 我觉得都是当xx[i][j] 不是字母的时候做下面的语句,但是根据题目又读不懂,谢谢哪位高手帮小妹指导一下,谢谢了。

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

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[s++]=' '; //如果不是字母,str[s++]被赋值为空格;
?? }

?? for(m=1;m<=k;m++) //上面这个循环是倒序处理,就是从最后往前。当第一个字符是字母的时候,上面这个循环只会作K++处理。
?? str[s++]=xx[i][j+m]; //所以,最后要补充这一个循环,把首字符串加到str[s++]里面。

?? str[s]='\0'; //C语言中,字符串末尾用'\0'表示一个字符串结束,此时str[s]就是题目想要的串。
?? strcpy(xx[i],str); //把str拷贝给xx[i],完成这一行的转换。
} //对第i行的处理结束;
} //StrOL

if(!isalpha(xx[i][j])) 和上面的那个else没有区别,可以写到一起。有可能是为了让程序更加健壮,也更加可读和便于维护才这样写。

再自己写一行字符串,把自己当作电脑运行一下这段程序更加有助于理解。您还需不需要我为您作更详细的执行描述?