先来看题

C语言刷题之倒置字符串的解题全过程

解题思路

? 首先我们定义一个字符数组来存放字符串,然后用 gets函数来读入字符串,接下来进行处理阶段,设计一个逆序函数逆序整个字符串,然后再逆序每个单词,最后处理一下细节再输出

解题过程

1.输入

定义完一个字符数组后,因为scanf不吃空格符和换行符,所以这里输入我们采用gets函数来进行读入字符串,看代码?

int main()
{
	char arr[101] = { 0 };
	//输入
	gets(arr);

2.设计逆序函数

看代码?

void reverse(char* left, char* right)
{
	assert(*left != NULL);
	assert(*right != NULL);

	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}

☝️字符串的首尾元素逐个进行交换(不包括\0)☝️

因为传过来的是数组首元素地址,所以我们要用指针变量来接收,为了代码更谨慎,这里使用了assert断言,防止遇到空指针而导致程序运行错误(不能忘记引头文件<assert.h>)

3.逆序整个字符串

	int len = strlen(arr);
	//逆序整个字符串
	reverse(arr, arr + len - 1);

?我们使用strlen函数来计算字符串元素个数(不要忘记引头文件<string.h>),然后调用 reverse函数进行整个字符串的逆置。

?这里的 arr + len - 1是首元素地址+字符串长度(整数)- 1 得到的是末尾元素的地址如果不 - 1指向的就是 ’\0‘了

4.逆序每个单词

char* cur = arr;
	while (*cur)
	{
		//找一个单词
		char* start = cur;
		while (*cur != ' ' && *cur != '\0')
		{
			cur++;
		}
		reverse(start, cur - 1);
		if (*cur == ' ')
		{
			cur++;
		}
	}

?定义一个指针变量cur来接收逆序整个字符串之后的arr数组首元素地址,然后如果cur指向的字符不是’\0’的话就进入循环,然后再定义一个指针变量start来接收每个单词的首元素地址,然后进入循环判断如果cur指向的不是空格或者’\0’就往后跳一个字符,直到cur指向的是空格或者’\0‘了,就说明已经遍历完确认了一个单词,然后进入reverse函数 来逆序单词(cur - 1 是因为如果不 -1,cur指向的是空格或者’\0‘

?最后如果cur指向的是空格而不是’\0‘就说明还没有结束,还有单词没有逆序完,往后跳一个字符循环继续

?最后打印输出

源码

#include<stdio.h>
#include<string.h>
#include<assert.h>

void reverse(char* left, char* right)
{
	assert(*left != NULL);
	assert(*right != NULL);

	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[101] = { 0 };
	//输入
	gets(arr);
	//处理
	int len = strlen(arr);
	//逆序整个字符串
	reverse(arr, arr + len - 1);
	//逆序每个单词
	char* cur = arr;
	while (*cur)
	{
		//找一个单词
		char* start = cur;
		while (*cur != ' ' && *cur != '\0')
		{
			cur++;
		}
		reverse(start, cur - 1);
		if (*cur == ' ')
		{
			cur++;
		}
	}
	//打印
	printf("%s\n", arr);

	return 0;
}

总结

原文地址:https://blog.csdn.net/weixin_74937672/article/details/129109718

相关文章:

  • 2021-12-07
  • 2022-12-23
  • 2022-12-23
  • 2021-05-18
  • 2021-09-18
  • 2021-07-25
  • 2021-12-16
猜你喜欢
  • 2023-02-24
  • 2022-12-23
  • 2021-07-31
  • 2022-12-23
  • 2021-05-03
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案