#include <stdio.h>
char *my_fanzhuan(char *s){//多写注释有助于初学者学习
//想不出来就先画图 理清整体思路
//先整体翻转
//以中间一个单词或者间隙为中心 头尾每个字符挨个对称交换
//交换用三杯水原则
//定义两个指针一个在头部一个在尾部
char *front = s;//头部指针
char *back = s;//尾部指针
while(*back){//将尾部指针移动到尾部\0
back++;
}
back--;//从\0后退一个到字符串最后一个字母
//判断条件指针 front > back
//不管字符串个数是奇数还是偶数条件都能满足交换
//空格也是字符串同样和对应的字母交换
char temp = 0;//定义杯子临时变量
while(front < back){
temp = *front;//三杯水交换
*front = *back;
*back = temp;
front++;
back--;
}
//然后每个单词翻转,每一个单词头尾交换
//也是三杯水交换,尾部指针判断条件为遇到空格或者\0
//定义一个指针mark专门负责记录空格或者\0的位置
char *mark = 0;
front = s;//重置头尾指针的位置到初始位置
back = s;
while(*back){//用尾指针的移动到\0作为大循环停止的判断条件
//大循环不确定次数 用while 确定次数 用for
while(*back != ' ' && *back != '\0'){
back++;
//小循环每遇到空格或者\0后停止
}
mark = back;
//用mark记录一下当前空格或\0的位置方便后面移动到下一个单词用
back--;//后退到前一位为交换单词的尾部字母
//现在front在单词头部back在单词尾部
while(front < back){//实现单词的头尾交换
temp = *front;//三杯水交换
*front = *back;
*back = temp;
front++;
back--;
}
//实现交换后头尾指针的位置是乱的
//要重新赋值初始化到下一个单词头尾位置
//只需要将front back 移动到下一个单词的头部再做下一轮循环即可
front = mark + 1;
back = mark + 1;
}
}
int main(int argc, const char *argv[])
{
char s[128] = {0};
gets(s);
my_fanzhuan(s);
printf("%s\n",s);
//printf("%s\n",my_fanzhuan(s));
//this is a book
return 0;
}
测试:
输入:this is a book
输出:book a is this