✨✨✨学习的道路很枯燥,希望我们能并肩走下来!
编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。
前言
本篇是练习字符串逆序,用到了两次逆序,希望能帮助开阔小伙伴的思路如有错误,请在评论区指正,让我们一起交流,共同进步! |
本文开始
1.题目内容
给定一个非空字符串,输出该字符串的逆序字符串.(字符串中可含有空格),给定I like beijing. 逆序完成后 beijing. like I
输入:I like beijing.
输出:beijing. like I
1.1思路
如果只是字符串逆序,我们可能只是得到 .gnijieb ekil I ,但是我们需要 beijing. like I ,保证单词顺序不变,我们可以①先逆序每个单词得到 I ekil .gnijieb,②再逆序整个字符串得到beijing. like I. 或者我们也可以先逆序整个字符串,在逆序每个单词.
1.2编写代码
准备逆序函数:我们需要逆序单词时直接调用传入单词首尾即可
逆序需要我们知道首尾下标,所以我们就需要参数left,right.
我们用指针来移动下标,每个单词left指向的字符,与right指向的字符交换,再使指针left++(左指针),指针right–(右指针),当left不再小于right时就完成单词逆序(left<right中间没有可交换元素循环终止).
void reverse_arr(char* left, char* right)
{
assert(left && right);
while (left < right)
{
char t = *left;
*left = *right;
*right = t;
left++;
right--;
}
}
主函数逆序每个单词思路:
准备cur:
首先使用我们需要把首地址交给一个指针变量(char* cur=arr).
①因为我们需要保留首地址的位置,②在最后移动整个字符串时需要用到.③可以用这个指针变量指向的值判断单词逆序循环是否结束.
char* cur = arr;
单词逆序:
ⅰ:定义两个指针(star,end)找到每个单词的首尾,开始都指向单词开头,让end指针判断如果不是空格就移动,遇到空格跳出,此时end指针指向空格,end-1指向单词末尾,将此时单词首尾地址star,end传入准备好的逆序函数完成逆序.**
ⅱ:每个单词结束标志可能空格或者\0,所以需要分情况讨论.
①如果*end是空格跳出,需要把空格下一个字符地址给cur (cur=end+1),循环条件(cur)就可以判断是否为字母,如果是字母就循环,把此时的字符地址当作下一个单词的首地址(char * star=cur),end指针再次指向单词开始部位,重复指行ⅰ
②如果end是\0跳出 (字符串每个单词逆序结束),需要把此时地址给end(cur=end),循环条件(*cur)就判断为假,循环结束.
单词逆序代码:
while (*cur)
{
//逆序每个单词
//先找到每个单词首尾
//每个单词结束后可能是空格或者\0
char* star = cur;
char* end = cur;
while (*end != ' '&&*end!='\0')
{
end++;
}
//把每个单词首地址和尾地址传给逆序函数,
//end出来指向是空格或者\0再-1才是尾地址
reverse_arr(star, end - 1);
//如果出来的是\0再返回end+1就越界了
if (*end != '\0')
{
cur = end + 1;
}
else
{
cur = end;
}
}
逆序整个字符串:
求出整个字符串长度len,用到库函数strlen(arr),
再次调用逆序函数传入参数arr,len
逆序字符串代码:
int len = strlen(arr) - 1;
reverse_arr(arr, arr+len);
printf("%s\n", arr);
2.字符串逆序总代码
#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse_arr(char* left, char* right)
{
assert(left && right);
while (left < right)
{
char t = *left;
*left = *right;
*right = t;
left++;
right--;
}
}
//I like beijing.
int main()
{
char arr[101];
gets(arr);
char* cur = arr;
while (*cur)
{
//逆序每个单词
//先找到每个单词首尾
//每个单词结束后可能是空格或者\0
char* star = cur;
char* end = cur;
while (*end != ' '&&*end!='\0')
{
end++;
}
//把每个单词首地址和尾地址传给逆序函数,end出来指向是空格或者\0再-1才是尾地址
reverse_arr(star, end - 1);
//如果出来的是\0再返回end+1就越界了
if (*end != '\0')
{
cur = end + 1;
}
else
{
cur = end;
}
}
//逆序整个字符串
int len = strlen(arr) - 1;
reverse_arr(arr, arr+len);
printf("%s\n", arr);
return 0;
}
总结
✨✨✨各位读友,本篇分享到内容是否更好的让你理解了字符串逆序,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!