#include <stdio.h>
#include <assert.h>
#include <string.h>
void reverse(char* left, char* right)
{
assert(left);
assert(right);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
//①先整体逆序:I love you.-->.uoy evol I
//②然后把每个单词逆序--->you. love I
char arr[101] = { 0 };
gets_s(arr);
//整体逆序:
int len = strlen(arr);
reverse(arr, arr + len - 1);//arr首元素地址即left,arr+len-1即最后一个元素的地址
//逆序每个单词:就是找到每个单词的起始地址,然后调用上边的reverse函数,就实现单词逆序 //了
//start记录每个单词起始地址 end记录每个单词结束位置,end如何确定:就是从start开始, //要不是空格就一直往后走,遇到空格了就说明一个单词结束了。
//遇到空格跳过去,新的end,赋给start就是一个新单词了
char* start = arr;
while (*start)
{
char* end = start;
while (*end != ' '&&*end!='\0')
{
end++;
}
reverse(start, end - 1);//end是空格的地址,所以end-1才是单词的尾地址
while ((*end) == ' '&&*end!='\0')//这里如果一个单词中间有不止一个空格,就需要判断一下, //直到他指向的不是空格了,再把end赋给start,
//如果end指向字符串最后一个单词就没必要再加l,所以加了个判断 //*end!='\0'
{
end++;
}
start = end;
}
printf("%s\n", arr);
return 0;
}