采用C语言
实现提取字符串
中浮点型数字
本文参考以下文章:
https://www.cnblogs.com/kangjianwei101/p/5220336.html
一、适用范围
适用于标准C语言的应用环境(比如c51、stm32单片机),除<stdio.h>
外,不需要使用其他头文件。
二、提取思想
请结合代码来看,代码在下文:
1.对字符串数组进行从前到后进行遍历,由于标准的C语言字符串以‘\0’
结尾,采用while
循环while ( *Str != '\0' )
;
2.在遍历过程中进行字符串对比,看当前字符串是不是属于数字0~9
或者为小数点.
;
3.当遍历到数字时,加入一个标志num_start = 1
;,说明是发现数字了;
4.当遍历到小数点时,加入一个标志num_point=1
,说明是发现小数点了;
5.再次发现数字,就根据小数点标志if(num_point >= 1)
来判断,当前数字是整数部分,还是小数部分;
6.对于整数部分的数字则直接处理,num[Fnum+1] = num[Fnum+1]*10+(*Str - '0')
;
7.对于小数部分还需要判断当前是小数的第几位,再进行处理:
num_point++;
float fpoint = *Str - '0';
for(int i = 1;i<num_point;i++)
{
fpoint = fpoint/10.;
}
num[Fnum+1] = num[Fnum+1] + fpoint;
8.将提取到的数字总数放入数组的开头 num[0] = Fnum
,数组后面则是提取的数字。
三、实现代码
原文件下载(不需要积分):
https://download.csdn.net/download/qq_40824852/69932727
#include <stdio.h>
//定义最大数组长度
#define StrExtFloat_flen 64
//定义最大字符串长度
#define StrExtFloat_slen 512
void StrExtFloat(float *num,char* Str)
{
//遍历深度
int Fflag = 0;
//数字个数
int Fnum = 0;
char num_start = 0,num_point = 0;
//遍历到字符串尾部
while ( *Str != '\0' )
{
Fflag++;
//防止查询超过边界
if(Fflag>StrExtFloat_slen)
break;
//判断是不是数字
if(*Str >='0' && *Str <= '9')
{
//printf("%c",*Str);
//判断数字存在
num_start = 1;
//判断是否存在小数点
if(num_point >= 1)
{
num_point++;
//当前小数部分的数值
float fpoint = *Str - '0';
for(int i = 1;i<num_point;i++)
{
fpoint = fpoint/10.;
}
//加入小数部分
num[Fnum+1] = num[Fnum+1] + fpoint;
}
else
{
//加入整数部分
num[Fnum+1] = num[Fnum+1]*10+(*Str - '0');
}
}
else if(*Str == '.') //判断为小数点
{
if(num_start==1)//发现存在小数点
{
num_point=1;
}
}
else //判断为其他字符
{
if (num_start == 1)
{
Fnum++;//统计个数加一
}
//清空字符统计与小数点统计
num_start = 0;
num_point = 0;
}
//指针移动
*(Str++);
}
//如果不是以字符结尾
if (num_start == 1)
{
Fnum++;//统计个数加一
}
//放入提取到的数字个数
num[0] = Fnum;
}
void main(void){
char Str[100]="235.654hjfv92.88u98fj3wjf09w43f0f3f963.369";
float num[StrExtFloat_flen] = {0.};
void StrExtFloat(float *num,char* Str);
StrExtFloat(num,Str);
printf("\n Total:%2.0f",num[0]);
for(int i=1;i<=num[0];i++)
printf("\n %d:%.4f",i,num[i]);
}
代码有完整注释,有疑问与建议,评论区留言。
四、演示结果
运行上述代码,结果如下:
Total: 9
1:235.6540
2:92.8800
3:98.0000
4:3.0000
5:9.0000
6:43.0000
7:0.0000
8:3.0000
9:963.3690