首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请好手帮忙小弟看看这个习题究竟哪里不对(字符串)

2012-09-09 
请高手帮忙小弟看看这个习题究竟哪里不对(字符串)题目是将字符串里的单词倒序比如i love A转换后为A love

请高手帮忙小弟看看这个习题究竟哪里不对(字符串)
题目是将字符串里的单词倒序
比如 
i love A
转换后为
A love i
------------
恳请大家帮忙看看,请指出小弟哪里没写对。想了半天了,小弟会结贴的。
------------
这个是习题答案。

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void)
{
 char str[81];
 char *p, temp;
 int i,n,length;
 gets(str);
 for (p = str,i=0,n = strlen(str); i<n/2; i++)//将整个字符串倒序
 {
  temp = *(p+n-1-i);
  *(p+n-1-i) = *(p+i);
  *(p+i) = temp;
 }
 puts(str);

 p = str;
 length=0;
 do //将字符串中的每个单词倒序
 {
  if( isalpha(*p) )
  {
  length++;
  }
  else
  {
  if(length>1)
  for(i=0; i<length/2; i++)
  {
  temp = *(p-1-i);
  *(p-1-i) = *(p-length+i);
  *(p-length+i) = temp;
  }
  length = 0;
  }  
 }
 while(*p++ != '\0');
 puts(str);
 return 0;
}

这个是小弟参照习题答案写的 ,但是写出来运行结果不对

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void)
{
char str[81];
char *t,tt;
int a,b,i,j,len;

gets(str);
a=strlen(str);
b=a/2;

for(i=0;i<b;i++)
{
tt = *(str+i);
*(str+i) = *(str+a-1-i);
*(str+a-1-i) = tt;
}
puts("整体倒序");
puts(str);

t = str;
len =0;
//核心思想:若当前指针位置是字母,长度+1,若不是字母且len>1(即代表单词边界;若len<1则代表字符串还未跳跃至单词首部,那么就需要执行p++,更合理的作法是*p++!='\0')
//这样做既执行了指针移动,又执行了解引用判断非结束符,一石二鸟,这里用do - while循环最好

do
{
if (isalpha(*t))
len++;

else
{
if(len>1) //若当前指针位置不是字母(既指向单词分隔字符),且长度>1,就代表指针已经移动到一个单词的尾部,此时是对单词做处理的最佳时机
{
for(j=0;j<(len/2);j++)
tt = *(t-1-j); //*(t-1)是单词尾部字符,*(t-1-j)是从尾部字符逐个倒退回来的字符
*(t-1-j) = *(t-len+j);//*(t+j) 是从第一个字符开始,逐个向前移动的字符(len/2为灵界点) 
*(t-len+j) = tt; //changge
}

//注意别忘记将len置0,因为每一个单词的长度都需要重新统计
len=0;
}
}while(*t++ !='\0');

//操作结束后对结果进行显示
puts(str);
return 0;
}

[解决办法]
当前指针位置不是字母时,单词内部倒序时,for循环没有加括号。

for(j=0;j<(len/2);j++)
{
tt = *(t-1-j); 
*(t-1-j) = *(t-len+j); 
*(t-len+j) = tt;
}

热点排行