描述:将一句话的单词进行倒置,标点不倒置。比如 I like China. 经过函数后变为:China. like I

有些时候,主语和宾语位置互换词义不会改变。比如,一件衣服穿两天,两天穿一件衣服。北京是首都,首都是北京。如果你已经读完了这段话,恭喜你已经浪费了几秒钟,这和这道编程题没什么关系……

思路:我们可以两次使用字符串逆序,第一次先将字符串整体逆序,第二次将单个单词再逆序。逆序字符串,无非是找到字符串的起始位置和结束位置,也就是左下标和右下标,当左下标地址小于右下标地址时,互换两个下标位置的字符串。关键在于寻找起始位置和结束位置,例如字符串arr,第一次字符串整体逆序,起始位置就是字符串的首地址arr,结束位置就是起始位置+字符串长度-1.第二次逆序每个单词,起始位置就是每个单词的起始位置,结束位置是空格或字符串0的前一位置。逆序每个单词要注意何时进行逆序,遍历整个字符串,当arr[i]的元素为空格或字符串0时,进行单词的逆序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<stdio.h>
#include<string.h>
void reverse(char* start, char* end)
{
char tmp;
while (start < end)
{
tmp = *start;
*start = *end;
*end = tmp;
start++;
end--;
}
}
int main()
{
char arr[100] = { 0 };
gets(arr);
int len = strlen(arr);
int i = 0;
//先将字符串整体翻转
reverse(arr, arr + len - 1);
char* a = arr;
for (i = 0; i <=len; i++)
{
if (arr[i] == ' ' || arr[i] == '\0')
{
reverse(a, arr + i-1);//空格之前的再一次翻转,两次翻转正好
a = (arr + i + 1);
}

}
printf("%s", arr);
return 0;
}

运行结果