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

嵌入式杂牌军

共 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语言专辑


软实力专辑


软件推荐专辑


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

手机扫一扫分享

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

手机扫一扫分享

举报