C语言实现——字符串逆序
目录前言如何实现代码实现1.设立一个数组存放输入的字符串2.将输入的字符串整体逆序2.1计算字符串长度2.2使用函数来实现倒置2.3实现函数reverse3.将其中每个单词再进行逆序3.1整个语句如何结束循环3.2每个单词的结束位置3.3内部实现...
目录
前言
如何将一串含有多个单词的字符串逆序,并且每个单词及标点符号不逆序输出呢,下面我们一起来实现一下吧。
示例:
输入下列字符:
I like beijing.
输出结果:
beijing. like I
如何实现
实现的思路如下:
1.设立一个数组存放输入的字符串
2.将输入的字符串整体逆序
.gnijieb ekil I
3.将其中每个单词再进行逆序
beijing. like I
代码实现
1.设立一个数组存放输入的字符串
#include <stdio.h>
int main()
{
char arr[100] = { 0 };
gets(arr);//注意没有使用scanf,因为scanf遇到空格就会停止接收输入的内容
printf("%s\n",arr);
return 0;
}
2.将输入的字符串整体逆序
需要整体逆序字符串,就需要一个函数来实现,且需要给函数传递两个参数:第一个元素和最后一个元素,而求这两个元素需要首元素地址并计算一下数组内字符串的长度。
2.1 计算字符串长度
int len = strlen(arr);
2.2 使用函数来实现倒置
reverse(arr,arr+len-1);
2.3 实现函数reverse
void reverse(char* left,char* right)
{
while(left < right)//只有当左边的地址小于右边的地址时,才交换,中间的不需要交换
{
char tmp = 0;//定义并初始化一个中间值
tmp = *left;//开始交换
*left = *right;
*right = tmp;
left++;
right--;
}
}
此时整体代码如下
void reverse(char* left, char* right)
{
while (left<right)
{
char tmp = 0;
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[100] = { 0 };
gets(arr);//获取字符串
//将字符串倒置
int len = strlen(arr);//计算字符串长度,以求最后一位的地址
reverse(arr, arr+len-1);//进行倒置
printf("%s\n",arr);
return 0;
}
我们输入 I like beijing. 试试
3.将其中每个单词再进行逆序
这时我们需要将其中每个单词再进行逆序,这样才能达到我们需要的效果。
这其中需要注意几点:
1.整个语句如何结束循环
2.每个单词的起始位置和结束位置
3.内部如何实现
4.怎样才能判断语句结束,从而停止逆序
3.1 整个语句如何结束循环
我们可以定义一个起始位置,当这个位置的地址等于 '\0' 时,那么就相当于语句结束了。
char* start = arr;
while(*start != '\0')
{
}
3.2 每个单词的结束位置
当遇到空格或者 '\0' 时,某一单词就结束了
我们可以首元素的地址赋给一个新的指针,只要这个指针指向的不是空格且不是 '\0' ,我们就让他往后挪一位,这样一个单词就找到了
char* start = arr;
while(*start != '\0')
{
char* end = start;
while(*end != ' ' && *end != '\0')
{
end++;
}
}
3.3 内部实现
此时只要利用之前定义的函数来交换这个单词的每个字符,就可以完成一个单词的逆序
char* start = arr;
while(*start != '\0')
{
char* end = start;
while(*end != ' ' && *end != '\0')//一个单词的结束位置
{
end++;
}
reverse(start, end - 1);
}
3.4 判断语句结束,从而停止逆序
接下来我们需要进行下一个单词的逆序,此时首元素的地址就需要之前的尾元素的地址再加1,那么如果整个语句结束了,此时还需要判断是否需要进行下一次逆序。
char* start = arr;
while(*start != '\0')
{
char* end = start;
while(*end != ' ' && *end != '\0')//一个单词的结束位置
{
end++;
}
reverse(start, end - 1);
if(*end != '\0')//还有下一个单词
start = end + 1;
else //末尾为'\0' 语句结束
start = end;//跳出循环
}
代码汇总
#include <stdio.h>
#include <string.h>
//输入 I like beijing.
//输出 beijing. like I
void reverse(char* left, char* right)
{
while (left<right)
{
char tmp = 0;
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[100] = { 0 };
gets(arr);//获取字符串
//将字符串倒置
int len = strlen(arr);//计算字符串长度,以求最后一位的地址
reverse(arr, arr+len-1);//进行倒置
//将每个单词再倒置
char* start = arr;//一个单词起始位置
while (*start != '\0')
{
char* end = start;
while (*end != ' ' && *end != '\0')//一个单词结束位置
{
end++;
}
reverse(start, end - 1);
if (*end != '\0')
start = end + 1;
else
start = end;
}
printf("%s\n", arr);
return 0;
}
结语
此时我们的程序就完成啦,让我们来运行一下试试吧!
输入I like beijing.
大功告成!
此时我们可以思考一下这种方法的衍生版本,
比如在某种原因下,我们将一串字符每个单词的顺序弄颠倒了,我们需要重新进行排序,此时如何不变动标点符号来逆序?
如何替换特定单词的顺序,比如想把 I beijing like.变为正常的 I like beijing.又需要进行哪些操作呢?
如果大家有更好的方法或者想法,欢迎大家在评论区留言讨论哦~
由于本人能力有限,若有错误,希望指正!!!
更多推荐
所有评论(0)