今天给小伙伴们带来一套实用的代码,可以将用逗号等字符间隔的字符串转换为数值,这个功能还是有一定的应用价值的,需要的小伙伴可以取用哈!
阅读过程中有什么问题可以后台交流哈,图片!
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;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
2)运行结果
本文转载自微信公众号「嵌入式杂牌军」,作者釜薪君。转载本文请联系嵌入式杂牌军公众号。