首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++ GNU ARM embedded中,有没有一种简单的方法可以从字符串中解析出浮点数?

在C++ GNU ARM embedded中,有没有一种简单的方法可以从字符串中解析出浮点数?
EN

Stack Overflow用户
提问于 2019-06-05 23:18:30
回答 2查看 149关注 0票数 1

我在我的C++ GNU ARM嵌入式系统中有这个字符串:

代码语言:javascript
复制
char* TempStr = "pressure 0.85";

我需要将数值存储为一个单独的名为presmax的浮点变量。

到目前为止,要解析的数字始终是一个整数,所以我可以使用sscanf而不会出现任何问题。然而,正如我在网上读到的(和亲身经历的),sscanf通常不能在嵌入式系统中的浮点数上工作(没有一些广泛的配置/闪存空间的损失)。

我想知道是否有人有什么建议。也许我可以将"0.85“解析为字符数组?我不太确定如何做到这一点,但它允许我使用atof()将其转换为一个浮点数,就像我在程序的其他地方所做的那样。

我意识到另一种选择是编写一个函数,但我是一个相当业余的程序员,所以如果有更健壮/更有效的解决方案,我最好选择它。

更新:如果有帮助,TempStr是一个使用FatFs从SD卡上的.txt文件复制的字符串。下面是每次读取两行代码并将结果存储在TempStr中的完整代码。每次存储TempStr时,我都会将字符串解析为其相应的变量:

代码语言:javascript
复制
FILINFO fno;
FIL fsrc;
int FileEnd = 0;
int CurrentLine = 0;
int pressmax = 0;
int timemax = 0;
char* TempStr;
WCHAR CharBuffer[100];

res = f_stat("config.txt", &fno);                               //check for config.txt file
res = f_open(&fsrc, "config.txt", FA_READ | FA_OPEN_ALWAYS);    //open config.txt file

//first line
TempStr = f_gets((char*)CharBuffer, sizeof(fsrc), &fsrc);      
CurrentLine ++;
FileEnd = FileEnd + strlen(TempStr) + 1;

//sscanf(TempStr, "%*s %i", &presmax);       //what I did when presmax was an int

//second line
while ((f_eof(&fsrc) == 0)){                                   
        TempStr = f_gets((char*)CharBuffer, sizeof(fsrc), &fsrc);
        CurrentLine ++;
        FileEnd = FileEnd + strlen(TempStr) + 1;
}

//sscanf(TempStr, "%*s %i", &timemax);     

在带有Eclipse的STM32L上使用GNU ARM构建工具。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-05 23:48:44

如果你保证你的输入将是

代码语言:javascript
复制
text floating_point_number

然后,一旦你有了TempStr,你就可以通过它前进一个指针,直到你到达空格,然后再前进一个位置,到达字符串的浮点部分。然后将该指针传递给atof,以从字符串的剩余部分中获取值。这看起来就像

代码语言:javascript
复制
char* fp = TempStr;
while (*fp != ' ') ++fp; // get to the space
double value = atof(++fp); // advance to floating point part and pass to atof

如果在获得值之后不需要TempStr,那么可以去掉fp,只需使用

代码语言:javascript
复制
while (*TempStr != ' ') ++TempStr ; // get to the space
double value = atof(++TempStr); // advance to floating point part and pass to atof
票数 0
EN

Stack Overflow用户

发布于 2019-06-06 02:59:03

可以按如下方式完成:

代码语言:javascript
复制
float presmax = (float)atof( strchr( TempStr, ' ' ) ;

强制转换之所以是必要的,是因为您的问题特别要求float,而atof()返回一个double。在任何情况下,强制转换都是隐式的,因此:

代码语言:javascript
复制
float presmax = atof( strchr( TempStr, ' ' ) ;

也是可以接受的。

strchr()返回指向第一个空格字符的指针,而atof()忽略任何前导空格。如果您的配置文件可能使用TAB字符,则:

代码语言:javascript
复制
float presmax = (float)atof( strpbrk( TempStr, " \t" ) ;

如果在未找到分隔符时strchr()strpbrk()返回NULL,则它将失败,因此您可以使其更健壮,如下所示:

代码语言:javascript
复制
#define PRESMAX_DEFAULT 1.0f

const char* prestr = strchr( TempStr ) ;
float presmax = prestr == NULL ? PRESMAX_DEFAULT : (float)atof( prestr ) ;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56463423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档