内存分配

/*
1 编写一个业务函数,实现字符串(前后各有三个空格,单词前后也均有空格)
"   i am student, you are teacher   " ,
各个单词首字符大写,结果如下"   I Am Student, You Are Teacher   " ,
要求1:实现所有接口  70
要求2:写出测试程序  30
*/
#define _CRT_SECURE_NO_WARNINGS

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string>
#include <iostream>
using namespace std;

int GetString(const char *str1 /*in*/, char *str2 /*in*/);

int GetString_Adv(const char *str1/*in*/, char **str2 /*out*/);
int GetString_Adv_Free1(char *str2);
int GetString_Adv_Free2(char **str2);

int GetString(const char *str1 /*in*/, char *str2 /*in*/)
{
	char *p1 = NULL, *p2 = NULL;
	int len = 0, i = 0;

	if (str1 == NULL || str2 == NULL)
	{
		return -1;
	}
	len = strlen(str1);
	strcpy(str2, str1);
	if (len <1)
	{
		return -1;
	}
	p1 = str2 + 1;
	p2 = str2;
	for (i = 0; i<len; i++)
	{
		cout << (int)*p1 << endl;
		if (isalpha(*p1) && isspace(*p2))
		{
			*p1 = *p1 - 32;
		}
		p1++;
		p2++;
	}
	return 0;
}

void main1()
{
	int ret = 0;
	char *p = "   i am student, you are teacher   ";
	char str2[1024 * 10] = { 0 };
	//char *str3 = (char *)malloc(1024*10*sizeof(char ));
	ret = GetString(p /*in*/, str2 /*in*/);
	if (ret != 0)
	{
		return;
	}
	printf("%s ", str2);

	system("pause");
}
int GetString_Adv(const char *str1/*in*/, char **pp2 /*out*/)
{
	char *p1 = NULL, *p2 = NULL;
	int len = 0, i = 0;
	char *tmp = NULL;

	if (str1 == NULL || pp2 == NULL)
	{
		return -1;
	}
	len = strlen(str1);

	tmp = (char *)malloc((len + 1) *sizeof(char));
	if (tmp == NULL)
	{
		return -2;
	}
	strcpy(tmp, str1);

	if (len <1)
	{
		return -1;
	}
	//准备循环条件
	p1 = tmp + 1;
	p2 = tmp;
	for (i = 0; i<len; i++)
	{
		if (isalpha(*p1) && isspace(*p2))
		{
			*p1 = *p1 - 32;
		}
		//准备循环条件
		p1++;
		p2++;
	}
	//赋值
	*pp2 = tmp;
	return 0;

}
//直接释放形参执向的内存空间,没有修改实参的值,不能有效的避免野指针
int GetString_Adv_Free1(char *str2)
{
	cout << str2 << endl;
	if (str2 != NULL)
	{
		free(str2);
		str2 = NULL;//没有修改实参的值,只是str2 = NULL,而实参的值还是野指针
	}
	return 0;
}

//直接释放形参执向的内存空间,间接去修改实参的值,有效的避免野指针
int GetString_Adv_Free2(char **str2)
{
	char *tmp = *str2;
	if (str2 == NULL)
	{
		return 0;
	}
	if (tmp != NULL)
	{
		free(tmp);
		*str2 = NULL;
	}
}

void main()
{
	int ret = 0;
	char *p = "   i am student, you are teacher   ";
	//char str2[1024*10] = {0};
	//str2 = 0x11;
	//char *str3 = (char *)malloc(1024*10*sizeof(char ));
	char *str2 = NULL;
	ret = GetString_Adv(p /*in*/, &str2 /*out*/);
	if (ret != 0)
	{
		return;
	}
	printf("%s ", str2);

	//if (str2 != NULL)
	//{
	//	free(str2);
	//	str2 = NULL;
	//}

	GetString_Adv_Free2(&str2);
	system("pause");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值