对字符串进行倒序排列,分为堆、栈两种形式

先理解一下free函数

在这里插入图片描述
  上面的dest_src进行了强制类型转换,下面的free也需要强制类型转换一下,不然系统以为程序释放了不该释放的内存所以就报错喽。

.
.
.
.

在堆区开辟空间-程序

.
.
对程序不理解之处

一、在strcpy()这里
.

二、free()这里出错了
.

  strcpy()函数是C语言中的一个复制字符串的库函数,不会考虑接收复制信息的数组的大小,因此在使用堆区存储的时候,给接收复制信息的数组分配相同大小或者更大的空间。
.

char *strcpy(char *dst, const char *src);

#define _CRT_SECURE_NO_WARNINGS //(只会在该文件里起作用)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define FUNC_CHIOCE 1 //定义了第一种方法

#if (FUNC_CHIOCE == 1)
void change_ab(char *a, char *b)
{
	int t = 0;
	t = *a;
	*a = *b;
	*b = *a;
}
#elif (FUNC_CHIOCE == 2)
void change_ab(char *a, char *b)//这里另外一个文章有详细解释
{
//使用算法进行互换
	*a = *a + *b;
	*b = *a - *b;
	*a = *a - *b;
}
#elif(FUNC_CHIOCE == 3)
void change_ab(char *a, char *b)
{
	*a = *a ^ *b;
	*b = *a ^ *b; 
	*a = *a ^ *b;
}
#endif
/* 字符串反转函数,返回字符串,char类型指针 */
char * str_reverse(char * src_str)
{
	int str_len = strlen(src_str); //长度统计
	char * dest_str = src_str;	
		//为字符串在堆区新开辟了一个空间,dest_str这个指针变量去指向这个新的空间
	
	char * pHead = &src_str[0];
			// 指向字符串的头,&取地址信息
	char * pTail = &src_str[str_len - 1];
			// 指向字符串的尾 并且减去字符串结束标志 '\0'【str_len - 1】

	while ( (pHead != pTail) && (pHead < pTail))//好习惯,都带上()
	{
		change_ab(pHead, pTail);
		pHead++;// 指向头部的指针往后移
		pTail--; // 指向尾部的指针往前移
	}
	return dest_str;
	//为什么要设置dest_str, 指针以及返回ret指针的位置[3],由于目的指针dst已经在进行移动了,所以用辅助指针ret表明首指针;(忘记为什么这样解释了,,,)
	//12-2:将数组首地址赋值给dest_str,对dest_str操作即是对数组进行操作,因此返回dest_str
}

/* 主函数 */
int main()
{

	char src_str[] = "hello world";

	char * dest_str = (char *)malloc(strlen(src_str));
		//z在堆区为数组开辟新的空间,让一个新的指针去指向它,若是在栈上main()函数执行完会被释放
		//开辟的大小正好是src_str[]数组的大小
		
	printf("Before reverse: %s\n", src_str);
		//str_reverse返回的就是char*类型呀    而strcpy的最后一个参数是 const char*类型  可以直接传进去 
	
	strcpy(dest_str, str_reverse(src_str));
		//将反转函数里实现好的字符排序,拷贝给指针dest_str所指向的空间里(都是char *类型)
		
	printf("After reverse: %s\n", dest_str);

	char * free((char*) dest_str);
		//这里记得也要带上强制类型转换
		//因为我们释放的地址里保存的是char*类型的数据
	dest_str = NULL;
		//使用完记得释放,否则会对堆区内存造成浪费
	
	
	
	return 0;
}

拷贝函数这里也可以这样写

	char *p = str_reverse(src_str);
	strcpy(dest_str, p);
	printf("After reverse: %s\n", dest_str);

在栈上运行程序

.
  直接 char *p = str_reverse(src_str); 这一步就可以了 这一步已经拿到结果存在栈内存中
.

#define _CRT_SECURE_NO_WARNINGS //(只会在该文件里起作用)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define FUNC_CHIOCE 1 //定义了第一种方法

#if (FUNC_CHIOCE == 1)
void change_ab(char *a, char *b)
{
	int t = 0;
	t = *a;
	*a = *b;
	*b = *a;
}
#elif (FUNC_CHIOCE == 2)
void change_ab(char *a, char *b)
{
	*a = *a + *b;
	*b = *a - *b;
	*a = *a - *b;
}
#elif(FUNC_CHIOCE == 3)
void change_ab(char *a, char *b)
{
	*a = *a ^ *b;
	*b = *a ^ *b; 
	*a = *a ^ *b;
}
#endif
/* 字符串反转函数 */
char * str_reverse(char * src_str)
{
	int str_len = strlen(src_str); 
	
	
	char * pHead = &src_str[0];// 指向字符串的头
	char * pTail = &src_str[str_len - 1];// 指向字符串的尾 并且-字符串结束标志 '\0'

	while ( (pHead != pTail) && (pHead < pTail))//好习惯,都带上()
	{
		change_ab(pHead, pTail);
		pHead++;// 指向头部的指针往后移
		pTail--; // 指向尾部的指针往前移
	}

	return src_str;
}

/* 主函数 */
int main()
{

	char src_str[] = "hello world";

	
	printf("Before reverse: %s\n", src_str);
	
	char * p = str_reverse(src_str);
	printf("After reverse: %s\n", p);


	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值