將以逗號為間隔的字符串轉(zhuǎn)為數(shù)值
今天給小伙伴們帶來一套實用的代碼,可以將用逗號等字符間隔的字符串轉(zhuǎn)換為數(shù)值,這個功能還是有一定的應用價值的,需要的小伙伴可以取用哈!
閱讀過程中有什么問題可以后臺交流哈,圖片!
1 關于函數(shù)功能的說明
1)主要函數(shù)介紹
主要函數(shù)如下:
① 求m的n次方,拼接數(shù)值時用到10的n次方。
② 找到逗號的位置函數(shù)。
③ 字符轉(zhuǎn)數(shù)值函數(shù)。
2)函數(shù)功能說明
代碼只是實現(xiàn)了將字符轉(zhuǎn)數(shù)值,將轉(zhuǎn)換結(jié)果打印,小伙伴們在實際使用時可以根據(jù)自己需要進行改造。
代碼可以指定保留小數(shù)點的位數(shù),Str2Num函數(shù)中參數(shù)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 == ',') // 找到逗號調(diào)整逗號數(shù)量
- {
- comma--;
- }
- buf++;
- }
- return buf-p; // 移動了多少次,就是逗號的位置數(shù)
- }
- /* 將字符串轉(zhuǎn)為數(shù)值 */
- 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為整數(shù)部分長度,flen為小數(shù)部分長度
- uint8_t mask = 0;
- int res;
- //得到整數(shù)和小數(shù)的長度
- while(1)
- {
- if(*p == '-') //是負數(shù)
- {
- mask |= 0x02;
- p++;
- }
- if(*p == ','||(*p == '*')) //遇到結(jié)束了,以逗號或星號為結(jié)束符
- {
- break;
- }
- if(*p == '.') //遇到小數(shù)點了
- {
- mask |= 0x01;
- p++;
- }
- else if( (*p > '9') || (*p < '0') ) //有非法字符
- {
- ilen = 0;
- flen = 0;
- break;
- }
- if(mask & 0x01)
- {
- flen++; // 遇到小數(shù)點則flen小數(shù)長度加1
- }
- else
- {
- ilen++; // 否則整數(shù)長度ilen加1
- }
- p++; // 指向緩沖下個位置
- }
- if(mask & 0x02) //去掉負號
- {
- buf++;
- }
- //得到整數(shù)部分數(shù)據(jù)
- for(i = 0; i < ilen; i++)
- {
- ires += Pow(10, ilen-1-i) * (buf[i] - '0'); // buf[0]為最高位數(shù)
- }
- if(flen > 3) //最多取3位小數(shù)
- {
- flen = 3;
- }
- //小數(shù)點位數(shù)
- *dx = flen;
- //得到小數(shù)部分數(shù)據(jù)
- for(i = 0; i < flen; i++)
- {
- fres += Pow(10, flen-1-i) * (buf[ilen+1+i] - '0');
- }
- // 獲取完整數(shù)據(jù) = 將整數(shù)部分*10的小數(shù)長度次方 + 小數(shù)部分
- res = ires * Pow(10,flen) + fres;
- if(mask & 0x02) // 如果是負數(shù),給數(shù)據(jù)加上負號
- {
- res=-res;
- }
- return res;
- }
- int main(int argc, char *argv[])
- {
- uint8_t i;
- char ch[100];
- uint32_t tmp[3],pos,posx;
- // 最多取3位小數(shù),第一個數(shù)小數(shù)只取641
- strcpy(ch,"-248.6413,148.64,28.64,22.11,");
- /* 將4個字符串轉(zhuǎn)數(shù)值并打印 */
- 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)運行結(jié)果
本文轉(zhuǎn)載自微信公眾號「嵌入式雜牌軍」,作者釜薪君。轉(zhuǎn)載本文請聯(lián)系嵌入式雜牌軍公眾號。