倒置字符串的要求,就是我们输入一串字符串:I like beijing. (每个单词中间用一个空格分开)
我们要输出:beijing. like i (以此类推!!!!)
我们的思路大概是这样子的:首先先把一整个字符串全部先逆序过来例如:I like beijing.
变成:.gnijieb ekil I 然后再把一段一段的单词分别再逆序一次,就可以达到最终的效果!
首先给大家放上完整的题解:如下
#include<stdio.h>
#include<string.h>
void reverse(char* left,char*right)
{
while (left < right)
{
char tem = *left;
*left = *right;
*right = tem;
left++;
right--;
}
}
int main()
{
char arr[101];
gets(arr);
int len = strlen(arr);
reverse(arr, arr +len-1);
char* start = arr;
char* cur = arr;
while (*cur)
{
while (*cur != ' ' && *cur != '\0')
{
cur++;
}
reverse(start, cur - 1);
start = cur + 1;
if (*cur == ' ')
cur++;
}
printf("%s\n", arr);
}
现在开始我们来一步一步了解我们是如何实现倒置字符串的
第一步:先读取用户输入的字符串,并且通过二分法的想法来写一个字符串逆序的函数,进行第一次的字符串整体逆序。(具体每一步的作用详细注释在代码里面了!!)
#include<stdio.h>//引用输入输出的一个标准头文件
#include<string.h>//由于下面需要用到strlen这个库函数,所以我们需要引一个他的头文件
void reverse(char* left,char*right)
//这边就是实现一个逆序函数,我们用left来接收字符串的起始地址,用right来接收字符串的末端地址
{
while (left < right)
//用二分法的思想只要left和right还没有交叉,就可以继续交换字符,
//如果同时指向同一个字符,也可以不交换,因为他刚好是中间的那一个字符
{
char tem = *left;
*left = *right;
*right = tem;//以上三行代码就是实现字符串的单个字符交换
left++;//交换完第一次,left需要重新指向下一个字符的位置,以便下一次交换
right--;//交换完第一次,right需要重新指向前一个字符的位置,以便下一次交换
}
}
int main()
{
char arr[101];//先初始化一个字符串
gets(arr);//读取用户输入的字符串,并存入arr中
int len = strlen(arr);//这边是计算用户输入的字符串有多长,方便一会进行逆序
reverse(arr, arr +len-1);//把字符串的起始地址,和末端地址传给逆序函数,进行第一次整体逆序
第二步:我们把整体函数逆序完成后,需要再把每个单词都分别单独逆序一遍
(具体每一步的作用详细注释在代码里面了!!)
char* start = arr;//这个指针的作用是,记录每一个单词逆序的起始地址
char* cur = arr;//这个指针的作用,记录每一个单词的末端地址的下一个位置
while (*cur)
//这个第一层的循环,为了保证每一次的单词逆序,
//只要不是指向字符串的结束位置\0就继续执行下一个的单词逆序
{
while (*cur != ' ' && *cur != '\0')
//这个第二层的循环是为了确定每一个单词的末端地址
//当每一个单词的末尾遇到一个空格或者是\0时,证明这个单词结束了
//可以开始执行这个单词的逆序了,就会退出循环开始执行下一步
{
cur++;//如果此时末尾不是空格或者\0,那么就再指向下一个位置查看
}
//跳出循环后,此时的start指向的就是这次这个单词的起始位置
//cur指向的就是这次这个单词的末端位置的后面一个位置
reverse(start, cur - 1);//进行此次的单词逆序,把单词的起始位置和末端位置传给逆序函数
start = cur + 1;//把单词的起始位置换成下一个单词的起始位置
if (*cur == ' ')
//如果此时cur指向的是一个空格,证明后面还有单词,还没有结束
//需要继续使cur重新指向下一个单词的起始位置,再一步步确定末端地址
//如果此时cur指向的是一个\0,那就证明整个字符串到头了,结束了。不需要指向下一个了
cur++;
}
printf("%s\n", arr);//最后打印出这个倒置过后的字符串!结束!
}
今天的分享就到这里,不知道有没有帮助到大家呢!
可以的话给我一个三连支持一下,谢谢大家!!