如图,本题要求将一句话中的单词进行倒叙
i like beijing.
可以考虑将其分成两步
第一步:先将每个单词倒置
即:
i ekil .gnijieb
第二步:将整个字符串倒置
即:
beijing. like i
也可以先将整个字符串倒置,再将每个单词倒置;
但这两种方法,都需要一个函数来实现倒置的功能
那在这里,我们考虑实现一下这个能实现倒置的函数
对于 beijing. 这个单词来说,一共有八个字符,
如图,单词开头和结尾各有两个箭头,他们指向单词的第一个字母和最后一个字母,只需要将他们交换一下位置,再让左边的箭头向右走一下,让右边的箭头向左走一下,重复这个操作即可,而这两个箭头,其实就是指针的概念。
//实现交换函数
void reverse(char* left,char* right)
{
while(left < right)
{
char tem = *left;
*left = *right;
*right = tem;
left++;
right++;
}
}
到现在,reverse这个能实现倒置功能的函数我们就实现了,但现在新的问题就是:我们应该如何确定这两个箭头呢
题目中要求我们先输入字符串,再对其逆置,这里由于i like beijing.这句话里有空格,所以我们选择gets来输入
即:
char arr[101] = { 0 };
gets(arr);
这样,我们就能够在运行代码时输入你想要逆序的字符串了
首先,让我们记录一下第一个字母的箭头,也就是i like beijing.这个字符串的首元素地址
char* cur = arr;
按照我们的逻辑,我们希望在字符串结束之前(遇到\0),能把字符串中的每个单词都倒置
因此,我们使用while循环
while(*cur)//只要没遇到\0,都会执行单词逆序这个过程
在while循环里,我们定义之前提到的两个箭头
char* start = cur;
char* end = cur;
如果*end指向的内容不是空格,也不是\0,那就让end箭头继续向后走一位,直到遇到空格为止
while(*end != ' ' && != '\0')
{
end++;
}
不管是空格还是\0让while停下来,箭头-1就是这个单词最后一个字母
这样 一个单词的起始位置和结束位置的两个箭头,我们就都获得了
调用之前写的reverse函数:reverse(strat,end-1);
此时右边箭头指向空格,我们只需要对end+1就可以让他跳转到下一个字母的起始位置了
进行到这里,一切看起来都很合理,但这里出现了一个问题:那如果是最后一个单词呢?
我们如果让指向 \0 的箭头再往右走,那可想而知结局一定很悲惨
因此我们要再进行一步判断
if(*end != '\0')
cur = end +1;
else
cur = end;
while循环到这里结束
至此,我们便实现了将每个单词逆序
同样的办法,我们再把整个字符串逆序。
int len = strlen(arr);
reverse(arr,arr+len-1);
printf("%s\n",arr);
这样,我们就实现了将一句话逆序的功能。接下来将贴出整个代码
#include <stdio.h>
#include <string.h>
void reverse(char* left, char* right)
{
while (left < right)
{
char tmp = *left;
* left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[101] = { 0 };
gets(arr);
//处理
char* cur = arr;
//逆序每个单词
while (*cur)
{
char* start = cur;
char* end = cur;
while (*end != ' '&& *end != '\0')
{
end++;//当循环停止时,*end就是' '了
}
reverse(start, end - 1);
if (*end != '\0')
cur = end + 1;
else
cur = end;
}
//逆序整个字符串
int len = strlen(arr);
reverse(arr, arr + len - 1);
printf("%s\n", arr);
return 0;
}
欢迎大家指出文章中的不足和纰漏,大家一起学习,成长,感谢大家耐心读完!