采用C语言实现提取字符串中浮点型数字

采用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
  • 17
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zhuzhu、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值