} }
★64: int i,j,len; char ch;
for(i=0;i len=strlen(xx[i]); ch=xx[i][len-1]; /*注意此语句不能放进第二层循环中*/ for(j=len-1;j>0;j--) xx[i][j]=(xx[i][j]>>4) +xx[i][j-1]; /*注意此处需要把右移部分用小括号括起来*/ xx[i][0]+=ch; /*注意此语句不能放进第二层循环中*/ } ★65: 运行结果不正确 int i,j,k,len; char ch,tmp; for(i=0;i { len=strlen(xx[i]); ch=xx[i][0]; /*注意此语句不能放进第二层循环中*/ for(j=0;j xx[i][j]+=xx[i][j+1]; xx[i][len-1]+=ch; /*注意此语句不能放进第二层循环中*/ for(j=0,k=len-1;j tmp=xx[i][j]; xx[i][j]=xx[i][k]; xx[i][k]=tmp; } } } 另外解法; int i,j; char ch; for(i=0;i ch=xx[i][0]; /*注意此语句不能放进第二层循环中*/ for(j=0;j xx[i][strlen(xx[i])-1]+=ch; /*注意此语句不能放进第二层循环中*/ strrev(xx[i]); /*串倒转*/ /*注意此语句所用的特殊函数*/ } ↓字符处理问题形式4 特殊-------------------------------------------------------- ★ 66: 正确理解题意并分析出算法: 理解题意并分析算法,这个思考过程最为重要,这是攻克本题的关键! 首先抽象一个例子: 假设要处理的字符串模型是:aobocod 那么根据题意很容易知道处理的步骤分别是:aobocod→bocoda→codab→dabc 同理再分析字符串abcodefogh,最后的结果是:ghabcdef 这样很容易就发现一个规律: 题目中原字符串的最后处理效果原来就是:将字符串中最后一个小写字母o左右两侧的内容互换,并消除所有小写字母o即可。 参考答案: int i,righto,j,s,k; char tem[80]; for(i=0;i k=0; memset(tem,0,80); /*初始化字符串数组tem*/ if(xx[i][j]=='o') /*如果当前字符为'o',进入以下语句*/ { righto=j; /*则将此字符中位置j的值赋给righto*/ for(s=righto+1;s tem[k++]=xx[i][s]; /*从righto的下一跳开始将其后所有的字符都存入到tem中*/ for(s=0;s else continue; } 清楚变量: 变量righto:用于存储字符串最右边(right)的一个小写字母o的位置(下标)。 字符串变量tem[80]:字符串暂存变量,在字符串处理过程中边处理边把处理好的字符串暂存到该字符数组中。每行全部处理完后,就将此字符串暂存变量赋值给原字符串全局变量xx[50][80]。 步骤: 与题目四类似也是先要确定两个大的循环架子: ㈠确定最外层循环:for(i=0;i ㈡每行字符串处理又需要一个循环:for(j=strlen(xx[i])-1;j>=0;j--)也是个倒序的循环。 倒序扫描每行字符串 ①从每行字符串串尾开始由后向前扫描,碰到小写字母o就停住,这样就确定了该字符串最右边的一个小写字母o的位置,并记录其下标将其存放在变量righto中。 ②接着将该行最右边的小写字母o的右边(后面)的字符串按照从字母o至行末的顺序全部存入到字符串暂存变量tem[]中。对应循环代码是for(j=righto+1;j ③将该行最右边一个小写字母o左边(前面)的的字符串按照从行首至该行最右边小写字母o的顺序存入到字符串暂存变量tem[]中。对应循环代码是for(j=0;j ④这样字符串暂存变量中存放的就是已经处理好的该行的字符串了。然后将此字符串暂存变量中处理好的字符复制存入到原字符串数组中。这样该行字符串处理完毕。然后字符串暂存变量初始化清零继续参与下一行的处理,周而复始直至文章全部处理完最终结束。 注意事项: 初始化语句k=0;righto=0;memset(tem,0,80);要在每次即将开始处理一行新字符串前先执行,所以该语句要么放在最外层两循环之间,要么放在第二个循环的循环体的最前面。 另外解法: int i; char *p,t[100]; /*p用来指向字符'o',t用来临时存放待处理的字符串中'o'前面的串*/ for(i=0;i p=strchr(xx[i],'o');/* 有字符'o'的话让p指向它,若没有返回NULL*/ while(p!=NULL) { memset(t,0,80); /* 清空数组t*/ memcpy(t,xx[i],p-xx[i]); /*将'o'前面的字符形成一个串拷贝到t中,临时存放 */ strcpy(xx[i],p+1);/* 将字符'o'后所有字符复制到xx[i],等同于删除'o'连同'o'前面的字符串*/ strcat(xx[i],t);/*将原'o'前面的字符串连接到处理后的字符串的末尾 */ p=strchr(xx[i],'o'); /* 寻找下一个字符'o'*/ } } ★67: int i,j,m;/*i,j都是循环变量,用于控制循环的执行次数,m用于保存xx[][]中保存的字符串的长度*/ char str[80]; for(i=0;i m=strlen(xx[i]);/*取出行字符数*/ memset(str,0,80);/*将str字符数组的所有元素设置为0*/ for(j=m-1;j>=0;j--) if(!isalpha(xx[i][j]))/*如果xx[i]字符串中的倒数第j个字符不是英文字母,则将这个字符串中第j+1到最后一个字符连接到str数组中*/ { strcat(str,xx[i]+j+1); strcat(str,\并在str数组中连接一个空格*/ xx[i][j]='\\0';/*之后将xx[i]中的第j个元素设置为字符串结束标志'\\0'*/ } strcat(str,xx[i]);/*将xx[i]中保存的字符串连接到str的后面*/ strcpy(xx[i],str);/*将字符串str复制到xx[i]中,覆盖xx[i]中的原有内容*/ }