C语言字符串处理

拆分字符串函数

/*****************************************
 * 函数名:	Split_Str	拆分字符串	
 * 功	 能:	把输入的字符串拆分成几个单独的字符串
 * 形	 参:	*oldstr	->	需要拆分的字符串
                len	->	需要拆分的字符串的长度
                cha	->	参考的目标字符(以该字符来拆分)
                newstr[10][20]	->	返回拆分后的数组(最大可接收10个字符串,且每个字符串最大可有20个字符)
                *newnumb	->	拆分后有多少个字字符串
 * 返回值:	形参形式返回,需定义二维数组来接收拆分后的数据	
******************************************/
void Split_Str(uint8_t *oldstr,uint8_t len, uint8_t cha, uint8_t newstr[10][20],uint8_t *newnumb)			
{
	uint8_t i = 0;				
	uint8_t loca[10] = {0};		
	uint8_t num = 0;			
	uint8_t n = 0;

	for(i = 0;i < len;i++)
	{
		if(oldstr[i] == cha)		
			loca[num++] = i;
	}
	if(loca[0] != 0)				
	{
		memcpy(newstr[n++],oldstr,loca[0]);		
		memset(newstr[n - 1] + loca[0],'\0',1);
		*newnumb = num + 1;						
	}
	else			
		*newnumb = num;
	
	loca[num++] = len - 1;			
	for(i = 1;i < num;i++)
	{
		if(loca[i + 1] > loca[i])	
		{
			memcpy(newstr[n++],oldstr + loca[i - 1] + 1,loca[i] - loca[i-1] - 1);		
			memset(newstr[n - 1] + loca[i] - loca[i-1] - 1,'\0',1);
		}
		else
		{
			memcpy(newstr[n++],oldstr + loca[i - 1] + 1,len - loca[i - 1] - 1);			
			memset(newstr[n - 1] + len - loca[i - 1] - 1,'\0',1);
		}
	}
}

注:使用时需创建结构体

数据类型转换(字符串转数值)

/*****************************************
 * 函数名:	StrToIntFloatValue	把字符串转换为数值(包括整形,浮点型)	
 * 功	 能:	把输入的字符串转换为带符号的int(float)数据
 * 形	 参:	*str	->	需要转换的字符串
                __STR *mystr	->	返回的数据(用结构体接收整形和浮点型数据)
 * 返回值:	形参形式返回,需定义结构体接收数据	
******************************************/
void StrToIntFloatValue(uint8_t *str, __STR *mystr)	//把字符串转换为数值(不分小数和整数)
{
	uint8_t i = 0;
	uint8_t Int_num = 0;
	int32_t Intbuff = 0;			
	float Float_Loca = 0;			
	uint8_t len = strlen((char*)str);		
	if(str[0] >= '0' && str[0] <= '9')		//正数
	{
		for(i = 0;i < len;i++)
		{
			if(str[i] >= '0' && str[i] <= '9')		
			{
				Intbuff += (str[i] - '0') * pow(10,len - Int_num - 1);		
				Int_num++;
			}
			else if(str[i] == '.')			
			{
				Float_Loca = i;			 
			}
		}
	}
	else if(str[0] == '-')		//负数
	{
		for(i = 1;i < len;i++)
		{
			if(str[i] >= '0' && str[i] <= '9')
			{
				Intbuff += (str[i] - '0') * pow(10,len - Int_num - 2);		
				Int_num++;
			}
			else if(str[i] == '.')			
			{
				Float_Loca = i;			
			}
		}
		Intbuff = -Intbuff;			
	}
	if(Float_Loca)		//判断是否有浮点型数据
		mystr->Floatvalue = (float)Intbuff / (float)pow(10,len - Float_Loca);		
	else
		mystr->Intvalue = (int)Intbuff;
}

使用说明:

  1. 定义一个结构体
typedef struct
{
	uint8_t NewStrNum;				//拆分后的字符串个数	
	uint8_t newstr[10][20];		//储存拆分后的字符串
	int32_t Intvalue;					//转换后的整形数据
	float 	Floatvalue;				//转换后的浮点型数据
}__STR;
  1. 调用函数示例
int main(void)
{
	__STR Mystr;
	uint8_t i = 0;
	uint8_t *str = "25H48";
    uint8_t inputBuf[5][15] = {"23H35","-12H-7","2.7H-35.4","H43H5.4"};		
	int16_t IntNumbers[5];
	float FloatNumbers[5];
	
	#if m
		Split_Str((uint8_t *)inputBuf[1],strlen((char*)inputBuf[1]), 'H',Mystr.newstr,&Mystr.NewStrNum);		//以字符'H'来拆分
		printf("String: %s  Size: %d\r\n",inputBuf[1],(int)strlen((char*)inputBuf[1]));
		for(i = 0;i < Mystr.NewStrNum;i++)
			printf("Str[%d]: %s  Size: %d\r\n",i,Mystr.newstr[i],(int)strlen((char*)Mystr.newstr[i]));		//打印拆分后的字符串

		for(i = 0;i < Mystr.NewStrNum;i++)		//两个整形数据
		{
			StrToIntFloatValue(Mystr.newstr[i], (__STR *)&Mystr);	//把字符串转换为数值(不分小数和整数)
			IntNumbers[i] = Mystr.Intvalue;
			printf("IntNumbers[%d] = %d\r\n",i,IntNumbers[i]);
		}
	#endif

	#if mn
		Split_Str((uint8_t *)inputBuf[2],strlen((char*)inputBuf[2]), 'H',Mystr.newstr,&Mystr.NewStrNum);		//以字符'H'来拆分
		printf("String: %s  Size: %d\r\n",inputBuf[2],(int)strlen((char*)inputBuf[2]));
		for(i = 0;i < Mystr.NewStrNum;i++)
			printf("Str[%d]: %s  Size: %d\r\n",i,Mystr.newstr[i],(int)strlen((char*)Mystr.newstr[i]));		//打印拆分后的字符串

		for(i = 0;i < Mystr.NewStrNum;i++)		//两个浮点型数据
		{
			StrToIntFloatValue(Mystr.newstr[i], (__STR *)&Mystr);	//把字符串转换为数值(不分小数和整数)
			FloatNumbers[i] = Mystr.Floatvalue;
			printf("FloatNumbers[%d] = %.2f\r\n",i,FloatNumbers[i]);
		}
	#endif

	#if mc
		Split_Str((uint8_t *)inputBuf[3],strlen((char*)inputBuf[3]), 'H',Mystr.newstr,&Mystr.NewStrNum);		//以字符'H'来拆分
		printf("String: %s  Size: %d\r\n",inputBuf[3],(int)strlen((char*)inputBuf[3]));
		for(i = 0;i < Mystr.NewStrNum;i++)
			printf("Str[%d]: %s  Size: %d\r\n",i,Mystr.newstr[i],(int)strlen((char*)Mystr.newstr[i]));		//打印拆分后的字符串

		StrToIntFloatValue(Mystr.newstr[0], (__STR *)&Mystr);	//把字符串转换为数值(不分小数和整数)
		printf("Intvalue = %d\r\n",Mystr.Intvalue);
		StrToIntFloatValue(Mystr.newstr[1], (__STR *)&Mystr);	//把字符串转换为数值(不分小数和整数)
		printf("Floatvalue = %.2f\r\n",Mystr.Floatvalue);
	#endif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值