实用的函数:1.一个包含多个小数的字符串对应转换为多个double类型的数据

实用的函数:1.一个包含多个小数的字符串对应转换为多个double类型的数据

1.代码示例:

/* ----------------------------------------------------------------------------------
    C code for: 将一个字符串转为多个double类型数据
    如:将保留6位小数的一个字符串:char str[] = "-1234.123456-20.1472580.1593571234567"转换为
        data1 = -1234.123456,data2 = -20.147258,data3 = 0.159357,data4 = 123456.000000
    anuthor:BinHeon https://blog.youkuaiyun.com/BinHeon
    date:   2021/06/03
    tips:
   ---------------------------------------------------------------------------------- */
#pragma warning(disable : 4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// -----------------------------------   全局参数   ---------------------------------
#define DecimalNum     6  // 小数位数
#define DATA_NUM       7  // 数的个数
#define ADATA_BUF_LEN  16 // 每个数的buf长度(即数的字符个数)

char AFrameBuf[DATA_NUM * ADATA_BUF_LEN];
double mdata[7];
// -----------------------------------     函数     ---------------------------------
//------------------ 1. 函数1
// 函数功能:将一个字符串转为多个double类型数据
// 输入:  *strBuf-字符串;Num-该字符串包含了几个double类型的数据;
//         pLen-该字符串中的各个数据保留pLen位小数;
//         *Data-采用引用的方式获得解析之后的double类型数据
// 输出:  0-解析异常;1-解析成功
int mStrBufferToDuble(char* strBuf,int Num,int pLen, double* Data)
{
    int itmp = 0.0, ptmp = 0.0; // 整数部分与小数部分
    int flag = 0;               // 负数标记
    int plen = 0,flen = 0;      // 小数部分:第plen位;flen:字符串指针
    long int pow = 1;int i = pLen;
    while (i--)pow = pow * 10;
    for (int inum = 0;inum < Num;inum++) {
        // ---- 异常情况:如果该位字符不属于  0-9/-/.
        if (('-' != strBuf[flen]) && ('.' != strBuf[flen]) && (('0' > strBuf[flen]) && ('9' < strBuf[flen])))return 0;
        // ---- 正常情况
        else {
            // -- 正负数判断
            if ('-' == strBuf[flen]) { // 首字符为负号,该数为负数
                flag = 1;
                flen++;
            }
            // -- 整数部分
            while (('.' != strBuf[flen])) {
                itmp = 10 * itmp + ((int)strBuf[flen] - '0');
                flen++;
            }
            // -- 偏移(跳过小数点符号)
            flen++;
            // -- 小数部分
            while (plen < pLen) {
                ptmp = 10 * ptmp + ((int)strBuf[flen] - '0');
                plen++;flen++;
            }
            // -- 赋值
            Data[inum] = flag ? (-(itmp + (double)ptmp / pow)) : (itmp + (double)ptmp / pow);
            plen = 0;flag = 0;itmp = 0;ptmp = 0;
        }
    }
    return 1;
}
// -----------------------------------     main     ---------------------------------
int main()
{
    // -------- 测试数据
    double d1 = -1234.123456789;
    double d2 = 4567.456789123;
    double d3 = -20.147258369;
    double d4 = -120.159357258;
    double d5 = -0.159357258;
    double d6 = 0.159357258;
    double d7 = 1234567;
    sprintf(AFrameBuf,"%.6f%.6f%.6f%.6f%.6f%.6f%.6f",d1,d2,d3, d4, d5, d6,d7); // 将测试数据格式化成一个字符串(保留6位小数)
    printf("The frame buffer -> %s\r\n", AFrameBuf);

    // -------- 解析字符串
    mStrBufferToDuble(AFrameBuf, DATA_NUM, DecimalNum,&mdata);
    for (int i = 0;i < DATA_NUM;i++)printf("The mdata[%d] -> %f\r\n",i,mdata[i]);

    return 0;
}
// -----------------------------------     end     ---------------------------------

在这里插入图片描述

2.注释:

注①:这是笔者在做项目中,需要的一个功能实现。由于该代码我只用了较短的时间写的,所以可能存在问题,当然也可能存在更好的办法。(写在此处,主要为了做个笔记)。
注②:C语言标准库“stdlib.h”当中有两个函数能够实现“将字符串转换成浮点数”,如果读者的字符串不是很复杂可以使用该函数,即“double atof(const char *nptr);”和“double strtod(const char *nptr,char **endptr);”;使用实例分别为:
示例1// -------------------------------------------------------
#include<stdlib.h>
#include<stdio.h>
int main()
{
double mdata;
char mstr[] = "123.456";
mdata=atof(mstr);
printf("The string is %s -> double: %.6f\n",mstr,mdata);
return 0;
}
// -------------------------end---------------------------
控制台输出:
The string is 123.456 -> double: 123.456000


// -------------------------------------------------------
示例2#include<stdlib.h>
#include<stdio.h>
void main()
{
    char *endptr;
    char a[] = "12345.6789";
    char b[] = "1234.567qwer";
    char c[] = "-232.23e4";
    printf( "a=%lf\n", strtod(a,NULL) );
    printf( "b=%lf\n", strtod(b,&endptr) );
    printf( "endptr=%s\n", endptr );
    printf( "c=%lf\n", strtod(c,NULL) );
}
// -------------------------end---------------------------
控制台输出:
a=12345.678900
b=1234.567000
endptr=qwer
c=-2322300.000000
参考:https://baike.baidu.com/item/strtod
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值