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;
}
使用说明:
- 定义一个结构体
typedef struct
{
uint8_t NewStrNum; //拆分后的字符串个数
uint8_t newstr[10][20]; //储存拆分后的字符串
int32_t Intvalue; //转换后的整形数据
float Floatvalue; //转换后的浮点型数据
}__STR;
- 调用函数示例
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;
}