一道三级编程题(字符串单词倒置题)

来源:百度知道 编辑:UC知道 时间:2024/05/27 13:13:22
第67套(字符串单词倒置题)
函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数StrOL(),其函数的功能是:以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT6.DAT中。
例如:原文:You He Me
I am a student.
结果:Me He You
student a am I
void StrOL(void)
{
int i,j,k;
char t[80],t1[80];
for(i=0;i<maxline;i++)
{
j=k=strlen(xx[i])-1;
t[0]=t1[0]='\0';
while(1)
{
while(isalpha(xx[i][j])==0&&j>=0)
k=--j;
while(isalpha(xx[i][j])&&j>=0)
j--;
memcpy(t1,&xx[i][j+1],k-j);
t1[k-j]='\0';
strcat(t,t1);
strcat(t," ");
if(j<0)
break;
}
strcpy(xx[i],t);
}
}

while(1)
{
while(isalpha(xx[i][j])==0&&j>=0)
k=--j;
while(isalpha(xx[i][j])&&j>=0)
j--;
memcpy(t1,&xx[i][j+1],k-j);

j=k=strlen(xx[i])-1; j,k,初值,定位在一行字符的最右端

while(isalpha(xx[i][j])==0&&j>=0) k=--j;
如果 xx[i][j] 不是字母,而且 j >= 0,
则 循环 做 j=j-1; k = j;
直到 遇到了 字母。
遇到了 字母循环 完毕,k 的 位置就是 最右边的第一个字母

while(isalpha(xx[i][j])&&j>=0) j--;
继续向左找,如果是字母,而且 j >= 0
则 循环 做 j=j-1
直到遇到了非字母。j 是后减减,退出循环时指向这个单词前的空白。

memcpy(t1,&xx[i][j+1],k-j);
j指向空白,j+1指向 第一个字母,k-j是字母个数
这句话执行 复制 xx[i]行里从j+1到k,共k-j个字符 到t1里。

t1[k-j]='\0'; t1 尾部加字符串结束标志。

strcat(t,t1); 把 t1 添加到成果存放单元t尾部。

strcat(t," "); t尾部 加 1 空白为放下一个词做准备。

j>=0 继续做大循环,这次接着前面一次向左找词

如此,便从 最末一个词找到最前一个词,找到一个添加到成果t里。

if(j<0) break; 所有字符都找过了,退出 while(1) 的循环。

1、isalpha是ctype.h中检查字符是不是字母的函数。是返回1。

2、j=k=strlen(xx[i])-1; 起初j和k都被定位在字符串最后一个字符的下标位置。

3、while(isalpha(xx[i][j])==0&&j>=0)k=--j;
这一步当xx[i][j]是字母时结束,即第一次遇到一个单词的字母,定位了k,指向一个单词的最后一个字母。

4、while(isalpha