在C+;中,有没有一种简单的方法可以从字符串解析浮点值+;嵌入式GNU ARM? 我在C++ GNU ARM嵌入式系统中有这个字符串: char* TempStr = "pressure 0.85";

在C+;中,有没有一种简单的方法可以从字符串解析浮点值+;嵌入式GNU ARM? 我在C++ GNU ARM嵌入式系统中有这个字符串: char* TempStr = "pressure 0.85";,c++,parsing,arm,embedded,gnu,C++,Parsing,Arm,Embedded,Gnu,我需要将数值存储为一个名为presmax的单独浮点变量 到目前为止,要解析的数字始终是一个整数,因此我可以使用sscanf而不会出现任何问题。然而,正如我在web上广泛阅读的(并亲身体验过的),sscanf通常不适用于嵌入式系统中的浮动(没有大量的配置/闪存空间损失) 我想知道是否有人有什么建议。也许我可以将“0.85”解析为一个字符数组?我不太确定该怎么做,尽管它允许我使用atof()将其转换为浮点,就像我在程序中的其他地方所做的那样 我意识到另一个选择是编写函数,但是我是一个业余程序员,所以

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

到目前为止,要解析的数字始终是一个整数,因此我可以使用sscanf而不会出现任何问题。然而,正如我在web上广泛阅读的(并亲身体验过的),sscanf通常不适用于嵌入式系统中的浮动(没有大量的配置/闪存空间损失)

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

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

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

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构建工具

如果保证您的输入将以

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

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
,只需使用

while (*TempStr != ' ') ++TempStr ; // get to the space
double value = atof(++TempStr); // advance to floating point part and pass to atof

如果您得到保证,您的输入将以

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

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
,只需使用

while (*TempStr != ' ') ++TempStr ; // get to the space
double value = atof(++TempStr); // advance to floating point part and pass to atof

可按如下方式进行:

float presmax = (float)atof( strchr( TempStr, ' ' ) ;
之所以需要强制转换,是因为您的问题特别要求使用
float
,并且
atof()
返回一个
double
。演员阵容在任何情况下都是隐含的,因此:

float presmax = atof( strchr( TempStr, ' ' ) ;
这也是可以接受的

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

float presmax = (float)atof( strpbrk( TempStr, " \t" ) ;
如果未找到分隔符时,
strchr()
strpbrk()
返回NULL,则会失败,因此您可能会使其更健壮,因此:

#define PRESMAX_DEFAULT 1.0f

const char* prestr = strchr( TempStr ) ;
float presmax = prestr == NULL ? PRESMAX_DEFAULT : (float)atof( prestr ) ;

可按如下方式进行:

float presmax = (float)atof( strchr( TempStr, ' ' ) ;
之所以需要强制转换,是因为您的问题特别要求使用
float
,并且
atof()
返回一个
double
。演员阵容在任何情况下都是隐含的,因此:

float presmax = atof( strchr( TempStr, ' ' ) ;
这也是可以接受的

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

float presmax = (float)atof( strpbrk( TempStr, " \t" ) ;
如果未找到分隔符时,
strchr()
strpbrk()
返回NULL,则会失败,因此您可能会使其更健壮,因此:

#define PRESMAX_DEFAULT 1.0f

const char* prestr = strchr( TempStr ) ;
float presmax = prestr == NULL ? PRESMAX_DEFAULT : (float)atof( prestr ) ;

什么类型的
TempStr
?您应该能够获取指向第一个数字的指针,然后将其传递给
atof
。TempStr是一个字符*。它是使用FatFs从SD卡上的.txt文件复制的字符串行。我将编辑上面的问题以包含这些信息。
TempStr的类型是什么?您应该能够获取指向第一个数字的指针,然后将其传递给
atof
。TempStr是一个字符*。它是使用FatFs从SD卡上的.txt文件复制的字符串行。我将编辑上面的问题,以包含这些信息。这当然适用于现在。谢谢。。。但是,随着项目的进展(以及我的技能的提高),我将不得不重新审视这一点,试图找出一些不依赖于完美输入的东西(以防有人键入config.txt行错误)。如果有人有什么建议,我很乐意听听。这就是sscanf的好处,它可以查看垃圾,只需获取数字。@Zurn为此,如果您只想提取浮点数,则可以扫描整行,直到找到一个
。然后从那里前后移动,直到你碰到非数字字符为止。然后将其复制到自己的缓冲区中,并将其传递给
atof
。请注意,没有100%的防弹方法来接受任何任意输入。有时,您只需发出错误并结束处理,或者返回到某个默认值并记录您已执行的操作。无需前进超过空格
atof()
跳过前导空格。一个次要的问题是,这个问题要求使用
浮点值
。这一点目前确实有效。谢谢。。。但是,随着项目的进展(以及我的技能的提高),我将不得不重新审视这一点,试图找出一些不依赖于完美输入的东西(以防有人键入config.txt行错误)。如果有人有什么建议,我很乐意听听。这就是sscanf的好处,它可以查看垃圾,只需获取数字。@Zurn为此,如果您只想提取浮点数,则可以扫描整行,直到找到一个
。然后从那里前后移动,直到你碰到非数字字符为止。然后将其复制到自己的缓冲区中,并将其传递给
atof
。请注意,没有100%的防弹方法来接受任何任意输入。有时,您只需发出一个错误并结束处理,或fal