目录

前言

如何实现

代码实现

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;
		else
			start = end;
	}
	printf("%s\n", arr);

	return 0;
}

结语

此时我们的程序就完成啦,让我们来运行一下试试吧!

输入I like beijing.

大功告成!

此时我们可以思考一下这种方法的衍生版本,

比如在某种原因下,我们将一串字符每个单词的顺序弄颠倒了,我们需要重新进行排序,此时如何不变动标点符号来逆序?

如何替换特定单词的顺序,比如想把 I beijing like.变为正常的 I like beijing.又需要进行哪些操作呢?

如果大家有更好的方法或者想法,欢迎大家在评论区留言讨论哦~

由于本人能力有限,若有错误,希望指正!!!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐