目录
前言
如何实现
代码实现
1.设立一个数组存放输入的字符串
2.将输入的字符串整体逆序
2.1 计算字符串长度
2.2 使用函数来实现倒置
2.3 实现函数reverse
3.将其中每个单词再进行逆序
3.1 整个语句如何结束循环
3.2 每个单词的结束位置
3.3 内部实现
3.4 判断语句结束,从而停止逆序
代码汇总
结语
前言
如何将一串含有多个单词的字符串逆序,并且每个单词及标点符号不逆序输出呢,下面我们一起来实现一下吧。
示例:
输入下列字符:
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;elsestart = end;}printf("%s\n", arr);return 0;
}
结语
此时我们的程序就完成啦,让我们来运行一下试试吧!
输入I like beijing.

大功告成!
此时我们可以思考一下这种方法的衍生版本,
比如在某种原因下,我们将一串字符每个单词的顺序弄颠倒了,我们需要重新进行排序,此时如何不变动标点符号来逆序?
如何替换特定单词的顺序,比如想把 I beijing like.变为正常的 I like beijing.又需要进行哪些操作呢?
如果大家有更好的方法或者想法,欢迎大家在评论区留言讨论哦~
由于本人能力有限,若有错误,希望指正!!!


















