上机南开100题难题解析
上机南开100题难题解析
本人觉得南开100题中最难的也就三四道题。其中就包括字符串处理问题。这种题型涉及到了南开100题的第三、四题。下面先解析南开100题的第四题。南开100题第四题首先明确函数的功能是:
以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中。木易版参考答案:
voidStrOL(void)
{inti,j,k,s,m,strl;
charstr[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中*/
}
}清楚变量:
程序代码中:
变量s:用于扫描每行字符串,
变量k:用于扫描每个单词。
字符串变量str[80]:用于存储每行处理完的字符。每行全部处理完后,即该行单词全部逆序排好后就将此字符串暂存变量赋值给原字符串全局变量xx[50][80]。步骤:
㈠确定最外层循环:for(i=0;i<maxline;i++)
㈡每行字符串处理又需要一个循环:for(j=strl-1;j>=0;j--)
从每行尾部开始逆序扫描每行字符串。
①向前扫描过程中是字母的继续前行;当遇到非字母字符,则停住,这样就确定了一个单词,将前面刚确定的这个单词存入字符串变量中!
②存好前面这个单词后将接下来的这个非字母字符变为空格,然后继续向前扫描。①②一直在每行字符串的循环中反复执行,直至逆序扫描至该行行首!注意事项:
①开始先将字符串暂存变量初始化为空。代码是memset(str,0,80);接着每行字符串扫描完处理完都要先将字符串暂存变量初始化为空后,再接着扫描处理下一行字符串!故代码memset(str,0,80);要么放在两个循环for(i=0;i<maxline;i++)和for(j=strl-1;j>=0;j--)之间要么


