实用的函数: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.csdn.net/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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
基本数据类型在不同的编程语言中可能存在一些差异,我将以Java语言为例,讲述8个基本数据类型的使用环境: 1. 整型(byte, short, int, long):用于表示整数类型数据。可以使用整型来存储年龄、数量、索引等整数值。在进行数值计算时,整型常用于存储和操作整数。 2. 浮点型(float, double):用于表示浮点数或小数类型数据。可以使用浮点型来存储身高、体重、金钱等具有小数部分的数值。在涉及到精度要求较高的计算时,建议使用`double`类型。 3. 字符型(char):用于表示单个字符。字符型数据以单引号括起来,例如`'A'`。可以用于存储和表示字符、字母、符号等。 4. 布尔型(boolean):用于表示逻辑值,只能取`true`或`false`。布尔型常用于判断和控制程序流程,例如条件判断和循环控制等。 这些基本数据类型可以在程序中声明变量,并为其赋予相应的值。例如: ```java int age = 25; double weight = 65.5; char grade = 'A'; boolean isStudent = true; ``` 需要注意的是,基本数据类型在内存中直接存储其值,不需要额外的内存分配。并且,它们可以直接进行数值计算和比较操作。 除了基本数据类型,Java还提供了相应的包装类(Wrapper Classes),用于操作对应的基本数据类型的对象表示。这些包装类提供了更多的功能,例如类型转换、数值计算和字符串转换等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值