前言:如下图,我们一般而言的字符串倒置,都是像第二句一样完完整整的倒置,但是你知道像第三种这种,整个单词都倒置是怎么实现的吗,下面我们就来讲解一下如何实现。
一.思路分析
看到这种题,我们首先想到的就是将整个字符串倒置,但是却不知道,怎么实现这种完整单词的倒置,那我们换位思考一下,是不是能在整体倒置的基础上,再来实现单个单词的再倒置呢?
二.代码展示与讲解
1.整体倒置
#include<stdio.h>
#include<string.h>
void Inversion(char* start,char* end)//实现整体倒置
{
while (start < end)
{
char temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
int main()
{
char arr[100] = { 0 };
gets(arr);//用grts()函数接收字符串更方便
int len = strlen(arr);
Inversion(arr, arr + len - 1);
printf("%s\n", arr);
return 0;
}
我们先实现了对整个字符串的倒置,将字符串的首,尾元素的地址传入,这样更容易进行倒置操作,也更利于我们接下来将单个单词的倒置。
2.单个单词倒置
void InversionWord(char* arr)
{
while (*arr)
{
char* left = arr;//定义指针来接收单词的最左边元素
while (*arr != ' ' && *arr != '\0')
{
arr++;
}
char* right = arr - 1;//定义指针来接收单词的最右边元素
Inversion(left, right);//将单词的左右元素地址传入实现单个单词倒置
if (*arr == ' ')
arr++;
}
}
我们定义一个新函数,并创建指针形参来接收数组的首元素地址,用最外层的while循环来控制——当指针走到字符串末尾'\0'时,终止循环。
我们知道,两个单词之间是有一个空格的,这便是我们判断单词末尾的标志,所以我们用内层while循环来控制。先定义left指针来接收单词的首元素地址,当指针没有走到' '或者'\0'的时候,我们的指针就一直往下走,遇见则停止。此时指针的指向的是' ',要减1才是单词右元素的地址,定义right指针来接收,再嵌套使用倒置函数就实现了单词的倒置,同时再用arr++将指针从指向' '移动到下一个单词的首字母。
这里要注意一点,当我们走到字符串最后一个元素时,内置while循环会实现arr++,此时指针指向了‘\0’,但是调用倒置函数之后,arr还会再++,这样arr指向的就不是‘\0’了,这样循环就不会终止,因此我们要使用if判断语句进行判断,只有当arr指向' '的时候,我们才往后移动。
三.完整代码展示
#include<stdio.h>
#include<string.h>
void Inversion(char* start,char* end)
{
while (start < end)
{
char temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
void InversionWord(char* arr)
{
while (*arr)
{
char* left = arr;
while (*arr != ' ' && *arr != '\0')
{
arr++;
}
char* right = arr - 1;
Inversion(left, right);//实现单词倒置
if (*arr == ' ')
arr++;
}
}
int main()
{
char arr[100] = { 0 };
gets(arr);
int len = strlen(arr);
Inversion(arr, arr + len - 1);
InversionWord(arr);
printf("%s\n", arr);
return 0;
}