????题目要求:
字符串:I love you
逆序后结果: you love me
????逆置法
假设逆置: Man Max
->整体逆置: xaM naM
->分别逆置 对xaM逆置:Max
对naM逆置:Man
->最终结果为: Max Man
????思路:
-
先整体逆置
-
定义两个指针,一个start,一个end,end负责移动。遇到字符串的空格就停下来,逆置[start,end-1]区间字符的内容 然后end和start指向end+1的位置。再继续寻找空格
-
当end遇到的是\0,说明已经到了字符串的尾了,退出循环
????图解
????代码
#include<stdio.h> #include<assert.h> #include<string.h> //区间逆置 void reverse(char* left, char* right) { assert(left && right); while (left < right) { char str = *right; *right = *left; *left = str; right--; left++; } } int main() { char str[100] = "Chase the wisdom 99"; int len = strlen(str); //1.先整体逆置 reverse(str, str + len - 1); //2.分别逆置,以空格为分隔 char* end = str; char* start = str; //循环判断条件:end指向的字符不是\0 while (*end != '\0') { //当end没有遇到\0 和空格就继续 while ( (*end != '\0') && (*end != ' ')) { end++; } //当end跳出循环时,指向的就是空格或者\0 逆置[start,end-1]的内容 reverse(start, end-1); //end向后移动,进行下一次循环 //start从end位置开始,重新定义起始区间 end++; start = end; } printf(str); return 0; }