实用 | 将以逗号为间隔的字符串转为数值

嵌入式杂牌军

共 12152字,需浏览 25分钟

 ·

2021-07-08 10:23

扫描二维码

获取更多精彩

嵌入式杂牌军

                                                     

                                                  编辑|追梦星空

                                            公众号|嵌入式杂牌军


✎ 编 者 悟 语

    

      有时环境会局限人的意识,但无意识中的自我良好归根结底还是格局不够大、心不够敞亮,在事情推进的过程中,回避本身更多的不是一种完备的解决方式,而是一种不负责、放任的态度。


      有时你拒绝的不是事情本身,而是生的过程。


文 章 导 读


    今天给小伙伴们带来一套实用的代码,可以将用逗号等字符间隔的字符串转换为数值,这个功能还是有一定的应用价值的,需要的小伙伴可以取用哈!

    阅读过程中有什么问题可以后台交流哈,


1 关于函数功能的说明



    1)主要函数介绍


    主要函数如下:


    ① 求m的n次方,拼接数值时用到10的n次方。


    ② 找到逗号的位置函数。


    ③ 字符转数值函数。


    2)函数功能说明


    代码只是实现了将字符转数值,将转换结果打印,小伙伴们在实际使用时可以根据自己需要进行改造。


    代码可以指定保留小数点的位数,Str2Num函数中参数dx并没有起到多大效用。


2 实例代码



    1)实例代码

    

    说明都在代码注释中了,


#include <stdio.h>
#include <stdlib.h>

#include <stdint.h>
#include <string.h>

/* 求m的n次方 */ 
uint32_t Pow(uint8_t m,uint8_t n)
{
     uint32_t result = 1;
   
     while(n--)
     {
          result *= m;  
     } 
    
     return result;
}

/* buf中获得第comma个都号的位置 */
uint8_t Comma_Pos(uint8_t *buf,uint8_t comma)
{        
     uint8_t *p = buf;
 
     while(comma)
     {   
          // 遇到'*'或者非法字符,则不存在第cx个逗号
          if(*buf == '*' || *buf < ' ' || *buf > 'z')          
          {
               return 0xFF;
          }
  
          if(*buf == ',')       // 找到逗号调整逗号数量                                  
          {
               comma--;
          }
  
          buf++;
    }
     
    return buf-p;              // 移动了多少次,就是逗号的位置数                                       
}

/* 将字符串转为数值 */ 
uint32_t Str2Num(uint8_t *buf,uint8_t *dx)
{
     uint8_t *p = buf;
     uint32_t ires = 0,fres = 0;
     uint8_t ilen = 0,flen = 0, i;               // ilen为整数部分长度,flen为小数部分长度
     uint8_t mask = 0;
     int res;
 
  //得到整数和小数的长度
     while(1)  
     {
          if(*p == '-')                          //是负数
          {
               mask |= 0x02;
               p++;
          }    
  
          if(*p == ','||(*p == '*'))             //遇到结束了,以逗号或星号为结束符 
          {
               break
          }  
  
          if(*p == '.')         //遇到小数点了                               
          {
               mask |= 0x01;
                p++;
          }    
          else if( (*p > '9') || (*p < '0') )   //有非法字符
          { 
               ilen = 0;
               flen = 0;
   
               break;
          } 
          if(mask & 0x01)
          {
               flen++;       // 遇到小数点则flen小数长度加1                          
          }
          else 
          {
               ilen++;       // 否则整数长度ilen加1                              
          }
          p++;               // 指向缓冲下个位置
     }
 
     if(mask & 0x02)         //去掉负号
     {
          buf++; 
     }       
 
     //得到整数部分数据
     for(i = 0; i < ilen; i++)      
     {  
          ires += Pow(10, ilen-1-i) * (buf[i] - '0'); // buf[0]为最高位数
     }
 
     if(flen > 3)                                     //最多取3位小数
     {
          flen = 3;
     }        
 
     //小数点位数
     *dx = flen;           
     
     //得到小数部分数据
     for(i = 0; i < flen; i++)      
     {  
          fres += Pow(10, flen-1-i) * (buf[ilen+1+i] - '0');
     } 
 
     // 获取完整数据 = 将整数部分*10的小数长度次方 + 小数部分
     res = ires * Pow(10,flen) + fres;                 
 
     if(mask & 0x02) // 如果是负数,给数据加上负号
     {
          res=-res;                          
     } 
 
     return res;
}


int main(int argc, char *argv[]) 
{
     uint8_t i;
     char ch[100];
     uint32_t tmp[3],pos,posx;                     
    
    // 最多取3位小数,第一个数小数只取641
     strcpy(ch,"-248.6413,148.64,28.64,22.11,");    
 
     /* 将4个字符串转数值并打印 */ 
     for(i = 0; i < 4; i++)
     {
          posx = Comma_Pos(ch, i);
 
          tmp[i] = Str2Num(ch + posx, &pos);
 
          printf("The value %d is: %d\n", i+1, tmp[i]);
     }

     return 0;
}


    2)运行结果



    今天就到这吧,希望对小伙伴有所帮助哈,喜欢的话欢迎转发、点赞、分享、在看、转载哈,


相关推荐


看文档|代码|电路的一些经验意识


我是如何学习(看待)公众号文章的


如何接手他人的项目代码(不限“工种”)


指针数组为什么不能这样初始化


数组与指针不能混用的情况


专辑分享


Linux专辑


C语言专辑


软实力专辑


软件推荐专辑


    欢迎关注我的公众号,一起撸代码,玩技术!
浏览 86
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报