C语言 – 字符串的逆置

在c语言中虽已有对应库函数,比如reverse()可对字符串进行逆置,但为了更加清晰地了解其工作原理,并为了多多感受指针、递归的魅力,所以本篇博客便是准备介绍几种字符串逆置的方法,辅助于自身探索之用。

无递归,利用指针的简单方法

此法是利用了指针,去依次交换字符,最后实现字符串的逆置。

/*
*文件功能:字符串逆置
*编写时间:2020-11-13
*/
#include<stdio.h>
#include<stdlib.h>
/*
*函数名: reverse_string_2
*函数参数:需逆置的字符串
*函数功能:逆置字符串
*/
void reverse_string_2(char *str)
{
	int len = strlen(str);
	for (int i = 0; i < len / 2; i++)
	{
	//实现字符串中对应位置字符的交换,可借鉴于数组交换
		char t = *(str+i);
		*(str + i) = *(str + len - i-1);
		*(str + len - i-1) = t;
	}
	//printf("%s\n", str);
}
/*主函数*/
int main()
{
	//char *p = malloc(100); //可以动态开辟空间,然后给字符串赋值
	char p[100];
	printf("请输入一个字符串:>");
	scanf("%s",p);
	reverse_string_2(p);//无递归  简单
	printf("逆置后字符串为:%s", p);
	system("pause");
	return 0;
} 

该程序亦可改写为下述程序:

#include<stdio.h>
#include<stdlib.h>
/*
*函数名: reverse_string_1
*函数参数:需逆置的字符串
*函数功能:逆置字符串
*/
void reverse_string_1(char * str)
{
	printf("%s\n", str);
	int l = strlen(str);
	char *left = str;//字符串中的首字符
	char *right = str + l - 1;//字符串中最后一个字符
	while (left < right)
	{
	//将left和right指向的字符进行交换
		char t;
		t = *left;
		*left = *right;
		*right = t;
	
		left++;//指向下一个字符或右边字符
		right--;//指向上一个字符或左边字符
		/*上述两行程序,会实现以字符的中间(如果字符串长度为奇数,则是
		**以中间的数,如果是偶数,则直接是将字符串的中间位置)为对称,
		**然后指针从两边往中间依次移位,并左右交换
		*/
	} 
	//printf("无递归:%s\n", str);
}
/*主函数*/
int main()
{
	//char *p = malloc(100);
	char p[100];
	printf("请输入一个字符串:>");
	scanf("%s",p);
	reverse_string_1(p);//无递归  简单
	printf("逆置后字符串为:%s", p);
	system("pause");
	return 0;
} 

有递归,利用指针的方法

   此法是在利用指针进行交换字符的基础上,使用了递归的方法。
   程序调用自身的编程技巧称为**递归**( recursion)。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
#include<stdio.h>
#include<stdlib.h>
/*
*函数名: reverse_string
*函数参数:需逆置的字符串
*函数功能:逆置字符串
*/
void reverse_string(char * str) 
{
	int len = strlen(str);
	char tmp = *str;//将指针指向的字符赋给tmp
	*str = *(str + len - 1);//将字符串的末尾字符赋给首位字符
	*(str + len - 1) = '\0';//将末尾字符先暂时置空
	//下述if语句实现的功能是判断是否到了字符串的中间位置
	if (strlen(str + 1) >= 2)
		reverse_string(str + 1);//实现指针所指位置的后移,递归
	*(str + len - 1) = tmp;//将tmp的值依次赋给被置空的末尾字符
	/*printf("有递归:%s", str);*/
}
/*主函数*/
int main()
{
	//char *p = malloc(100);
	char p[100];
	printf("请输入一个字符串:>");
	scanf("%s",p);
	reverse_string(p);//有递归
	printf("逆置后字符串为:%s", p);
	system("pause");
	return 0;
} 

读者可根据自身需求,对上述程序进行调试,仔细体会一下递归或无递归实现字符串逆置的实现原理。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐