题目:编写一个C函数, 将”I am from shanghai!”倒置为”shanghai! from am I”, 即将句子中的单词位置倒置,而不改变单词内部结构。
思路:首先把整个字符串逆序,接下来分别逆序每个单词。
实现代码:
#include <stdio.h>
#include <string.h>
void swap(char *a, char *b) // 交换函数
{
char tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
void str_rev(char *begin, char *end) // 逆序函数
{
while (begin < end)
{
swap(begin, end);
begin++;
end--;
}
}
void word_rev(char *str) // 单词逆序函数
{
char *begin = str; // begin指向单词的首个字符
char *end = begin;
while (*begin) // 如果begin指向\0,结束循环
{
while (*end != ' ' && *end != '\0') // 如果end指向不是空格或\0,则继续往后偏移
{
end++;
}
str_rev(begin, end - 1); // end - 1表示end指向空格或者\0前的字符,也就是单词的末尾
begin = end + 1; // begin指向下一个单词的首位
if (*end != '\0') // 如果不指向\0,则end指向下个单词的首个字符
{
end++;
}
}
}
int main()
{
char str[] = "I am from shanhai!";
int len = strlen(str);
puts(str);
str_rev(str, str + len - 1);
word_rev(str);
puts(str);
return 0;
}