请高手帮忙小弟看看这个习题究竟哪里不对(字符串)
题目是将字符串里的单词倒序
比如
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;
}