将传感器的输出带逗号的字符串分割、提取并且变成数字量

查找逗号位置偏移量函数(想省流就看本篇文章最后的代码)

这个函数能查找逗号,但是 最后一个逗号的后面的内容不好处理。

/**
 *******************************************************************************
 * @brief   查找逗号位置偏移量 函数
 * @param   [in] *str 字符串指针
 * @param   [in] cx   从*str里面得到第cx个逗号所在的位置
 * @return  0~0XFE,代表逗号所在位置的偏移; 0XFF,代表不存在第cx个逗号
 * @note
 *******************************************************************************
 */
unsigned char CommaPosOffset(char* str, unsigned char cx)
{
    char* p = str;
    while (cx)
    {
        if ((*p == '*') || (*p < ' ') || ('z' < *p))return 0xFF; //遇到'*'或者非法字符,则不存在第cx个逗号
        if (*p == ',')cx--;
        p++;
    }

    return p - str;
}

int main()
{
    char a[] = { "abc,defg,hijk" };
    char n = 0;//第n个逗号的偏移量
    n = CommaPosOffset(a,2);
    printf("第二个逗号在数组a中的偏移量为:%d \r\n", n);
    return 0;
}

证明第二个逗号的偏移量为9,这样就有很多的操作空间,例如取逗号左边的数据:

取逗号左边的数据

/**
 *******************************************************************************
 * @brief   查找逗号位置偏移量 函数
 * @param   [in] *str 字符串指针
 * @param   [in] cx   从*str里面得到第cx个逗号所在的位置
 * @return  0~0XFE,代表逗号所在位置的偏移; 0XFF,代表不存在第cx个逗号
 * @note
 *******************************************************************************
 */
unsigned char CommaPosOffset(char* str, unsigned char cx)
{
    char* p = str;
    while (cx)
    {
        if ((*p == '*') || (*p < ' ') || ('z' < *p))return 0xFF; //遇到'*'或者非法字符,则不存在第cx个逗号
        if (*p == ',')cx--;
        p++;
    }

    return p - str;
}

int main()
{
    char a[] = { "  1.0000, 23.2322,456.7777" };
    char n1 = 0;//第n个逗号的偏移量
    char n2 = 0;//第n-1个逗号的偏移量
    char p = 0;//两个逗号相隔了多少偏移量
    char i = 0;
    char b[10] = { 0 };
    n1 = CommaPosOffset(a,2);
    printf("第二个逗号在数组a中的偏移量为:%d \r\n", n1);

    n2 = CommaPosOffset(a, 1);
    printf("第一个逗号在数组a中的偏移量为:%d \r\n", n2);

    p = n1 - n2;
    printf("两个逗号的地址相差了:%d \r\n", p);
    
    for (i = 0; i < p-1; i++)//减一的目的是数组是从0开始的而不是1 可以试试不减,则最后带一个逗号
    {
        b[i] = a[n2 + i];//这个是要取第一个逗号之后,第二个逗号之前的字符值,所以需要加上n2的偏移量才能到第一个逗号结束的位置
    }
    printf("第二个逗号之前,第一个逗号之后的字符串为:%s\r\n",b);
    return 0;
}

但是最后一个逗号的右边数据不好取所以加以改进:

其中 cx 输入

大于数组中逗号的值的时候会 输出错误

想要获得最后一个逗号n后面数据的偏移量也就是整个数组的偏移量则输入 n+1则可

/**
 *******************************************************************************
 * @brief   查找逗号位置偏移量 函数   如果只有2个逗号,要取第二个逗号的右边的偏移量则输入3
 * @param   [in] *str 字符串指针
 * @param   [in] cx   从*str里面得到第cx个逗号所在的位置
 * @return  0~0XFE,代表逗号所在位置的偏移; 0XFF,代表不存在第cx个逗号
 * @note
 *******************************************************************************
 */
unsigned char CommaPosOffset(char* str, unsigned char cx)
{
    char* p = str;//传入的数组
    char i = 0;
    unsigned char lastCommaPos = 0;
    unsigned char commaCount = 0;
    unsigned char z = 0;//传入数组的最后一个偏移量
    for (i = 0; str[i] != '\0'; i++)
    {
        z++;//跟着++到最后一个偏移量

        if (str[i] == ',')
        {
            lastCommaPos = i;//最后一个逗号的a[i]的i值 也就是最后一个逗号的偏移量在哪

            commaCount++;//计算有几个逗号
        }
    }
    if (cx <= commaCount)//如果输入的逗号小于或等于buf的逗号数量则
    {
        while (cx)
        {

            if ((*p == '*') || (*p < ' ') || ('z' < *p))return 0xFF; //遇到'*'或者非法字符,则不存在第cx个逗号
            if (*p == ',')cx--;
            p++;//p进行偏移
        }

        return p - str;//P偏移后的数值-数组初始值 = 偏移量 例如偏移了5个字节
    }
    else if (cx == commaCount + 1) //如果输入的是最后一个逗号+1:表示想获取最后一个逗号的右边的数值则
    {
        printf("数值:%d ", &p[z] - str);
        return &p[z] - str;//取最后一个偏移量的地址-数组初始值 = 整个数组的大小
    }
    else if(cx > commaCount+1)//如果cx不符合条件则
    {
        printf("你输入的逗号数量有误\r\n");
        return 0xFF;
    }
}

所以获取逗号之前的某个数值的整体函数:

#include <stdio.h>
#include <stdlib.h>
/**
 *******************************************************************************
 * @brief   查找逗号位置偏移量 函数   如果只有2个逗号,要取第二个逗号的右边的偏移量则输入3
 * @param   [in] *str 字符串指针
 * @param   [in] cx   从*str里面得到第cx个逗号所在的位置
 * @return  0~0XFE,代表逗号所在位置的偏移; 0XFF,代表不存在第cx个逗号
 * @note
 *******************************************************************************
 */
unsigned char CommaPosOffset(char* str, unsigned char cx)
{
    char* p = str;//传入的数组
    char i = 0;
    unsigned char lastCommaPos = 0;
    unsigned char commaCount = 0;
    unsigned char z = 0;//传入数组的最后一个偏移量
    for (i = 0; str[i] != '\0'; i++)
    {
        z++;//跟着++到最后一个偏移量

        if (str[i] == ',')
        {
            lastCommaPos = i;//最后一个逗号的a[i]的i值 也就是最后一个逗号的偏移量在哪

            commaCount++;//计算有几个逗号
        }
    }
    if (cx <= commaCount)//如果输入的逗号小于或等于buf的逗号数量则
    {
        while (cx)
        {

            if ((*p == '*') || (*p < ' ') || ('z' < *p))return 0xFF; //遇到'*'或者非法字符,则不存在第cx个逗号
            if (*p == ',')cx--;
            p++;//p进行偏移
        }

        return p - str;//P偏移后的数值-数组初始值 = 偏移量 例如偏移了5个字节
    }
    else if (cx == commaCount + 1) //如果输入的是最后一个逗号+1:表示想获取最后一个逗号的右边的数值则
    {
        printf("数值:%d ", &p[z] - str);
        return &p[z] - str;//取最后一个偏移量的地址-数组初始值 = 整个数组的大小
    }
    else if(cx > commaCount+1)//如果cx不符合条件则
    {
        printf("你输入的逗号数量有误\r\n");
        return 0xFF;
    }
}




/**
 *******************************************************************************
 * @brief   CTD获取压力值  ///以逗号的方式分割CTD的数值,并且获得到相应字符 (后续需要用字符串转数字函数进行转换才能进行计算 函数在下面!!)
 * @param   [in] *str 字符串指针
 * @param   [in] cx   从*str里面得到第cx个逗号所在的位置
 * @return  0~0XFE,代表逗号所在位置的偏移; 0XFF,代表不存在第cx个逗号
 * @note
 *******************************************************************************
 */
double CTD_P(char* buf)
{
    char i = 0;
    char b[100] = { 0 };//这个BUF取决于传入进来的BUF有多大 越大越好
    char p = 0;//逗号之间的偏移量 
    double c;
    p = CommaPosOffset(buf, 3) - CommaPosOffset(buf, 2);//P=小数点3的偏移量-小数点2的偏移量 例如15-13=2 第二个小数点在13 第三个小数点在15

    for (i = 0; i <= p - 1; i++)
    {
        b[i] = buf[CommaPosOffset(buf, 2) + i];//b数组中的值=某个小数点后面的偏移量+现在数字的偏移量
    }
    printf("压力字符数值为:%s\r\n", b);
    c = atof(b); //将字符串类型转换成浮点数类型
    printf("压力数字值为num = %lf\r\n", c);
    return c;
}


int main()
{
    double c = 0;
    char a[] = {" 26.9174,  5.0069, 87.1011, 31.4417"};//一定不要忘记这是字符型记得加双引号
    c = CTD_P(a);
    printf("C = %lf", c);
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值