#include<stdio.h>
#include<assert.h>
/* 将一句话的单词进行倒置,标点不倒置。
* 比如 "I like beijing.",
* 经过处理后变为:"beijing. like I"。
* 字符串长度不超过100。
*/
//解题思路:
//I like beijing.逆序
//.gniieb ekil I 再对单词逆序
//beijing. like I
//将逆序函数调用两次即可
void reverse_str(char* l, char* r)
{
assert(l != NULL && r != NULL);//断言
while (l < r)
{
char tmp = *l;
*l = *r;
*r = tmp;
l++;
r--;
}
}
int main()
{
char arr[100] = { 0 };
//输入
gets(arr);//scanf读取字符串时,只读到空格处。或者:scanf("%[^\n]",arr];
//定义两个指针,分别指向字符串的首地址和尾地址
char* left = arr; //数组的数组名就是数组的首地址
int len = strlen(arr); //strlen()读取到'\0'的前一个字符,取字符串开始到这个位置的字符个数
char* right = arr + len - 1;//数组下标从0开始
//1.逆序字符串
reverse_str(left, right);
//printf("%s\n", arr);
//2.逆序单词
//存储单词开始的位置
char* cur = arr;
char* start = cur;
//向后移动cur
//当循坏到'\0'时,字符串结束
while (*cur != '\0')
{
//当遇到空格时,开始逆置单词,当循坏到字符串结束时,开始逆置最后一个单词
while (*cur != ' '&&*cur != '\0')
{
cur++;
}
reverse_str(start, cur-1);//这里最好不要使用cur--,因为会改变cur
start = cur + 1;
if (*cur != '\0')
{
cur++;
}
}
printf("%s\n", arr);
return 0;
}