【C语言】三种方法实现字符串逆序

本文介绍了如何在C语言中,不使用内置的strlen函数,通过迭代和递归两种方法实现字符串逆序,包括使用数组和指针的实现细节以及示例代码。

题目:实现字符串逆序
实现 - 将参数字符串中的字符反向排列,注意:并非逆序打印
要求 - 不能使用C函数库中的字符串操作函数 如:strlen()



一、预览效果

  • 主页面
    在这里插入图片描述
  • 任意输入一串字符

二、实现自己的strlen函数

由于要求:不能使用C函数库中的字符串操作函数,因此我们可自行编写一个函数my_strlen()来统计字符串的长度。将上述中strlen()更换为my_strlen()即可。

拓展:
strlen是一个库函数,需要引用头文件#include <string.h> ,是专门求字符串长度的,只能针对字符串,返回的是字符串的实际长度,从参数给定的地址向后一直找'\0',即统计'\0'之前出现的字符的个数。

sizeof是C语言中的一个单目运算符,是用来计算变量(类型)所占内存空间的大小,不关注内存中存放的具体内容,单位为字节,即包括'\0'在内。

实现代码如下

int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		str++;
		count++;
	}

	return count;
}

三、实现方法

1.迭代

即使用循环的方法

实现代码如下:

int reverse(char str[])
{
	char temp = 0;
	int left = 0;
	int right = my_strlen(str) - 1;
	
	while (left < right)
	{
		temp = str[left];
		str[left] = str[right];
		str[right] = temp;

		left++;
		right--;
	}
}

int main()
{
	char str[20];

	printf("请输入字符串:>");
	scanf("%s", str);
	//int sz = sizeof(str) / sizeof(str[0]); - 求数组长度,只适用于已定义的数组	
	reverse(str);
	printf("逆序的字符串:>%s\n", str);

	return 0;
}

2.递归

①数组(易理解)

将字符串数组、数组首下标,数组尾下标传入函数reverse_string,直接将首尾字符交换,随即限制一个递归条件,从两头往中间交换。
实现代码如下:

int reverse_string(char str[], int left, int right)
{
	if (left < right)
	{
		char temp = str[left];
		str[left] = str[right];
		str[right] = temp;
		reverse_string(str, left + 1, right - 1);
	}
}

int main()
{
	char str[20];

	printf("请输入字符串:>");
	scanf("%s", str);

	int left = 0;
	int right = my_strlen(str) - 1;

	reverse_string(str, left, right);
	printf("逆序的字符串:>%s\n", str);

	return 0;
}

②指针(较难理解)

步骤:
1.将第一个字符拿给temp
2.将最后一个字符拿到第一个字符
3.将最后一个字符的位置添上一个’\0’使得中间未经更改的字符变为一个字符串
4.将中间这个字符串(不包含’\0’)逆序
5.将第三步的’\0’处,即最后一个字符赋值为第一个字符(temp)
实现代码如下:

int reverse_string(char* str)
{
	char temp = *str;			//1
	int len = my_strlen(str);
	*str = *(str + len - 1);	//2
	*(str + len - 1) = '\0';	//3
	if (my_strlen(str + 1) >= 2)	//终止递归,如果仅有一个字符就停止递归
	{
		reverse_string(str + 1);//4
	}
	*(str + len - 1) = temp;	//5
}

int main()
{
	char str[20];

	printf("请输入字符串:>");
	scanf("%s", str);
	//int sz = sizeof(str) / sizeof(str[0]); - 求数组长度,只适用于已定义的数组	
	reverse_string(str);
	printf("逆序的字符串:>%s\n", str);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值