我的C ++ GNU ARM嵌入式系统中有以下字符串:
char* TempStr = "pressure 0.85";
我需要将数字值存储为称为presmax的单独的float变量。
到目前为止,要解析的数字始终是整数,因此我可以毫无问题地使用sscanf。但是,正如我在网络上广泛阅读的(并且经验丰富的第一手资料)一样,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 Build工具。
答案 0 :(得分:0)
如果可以保证您输入的内容为
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
答案 1 :(得分:0)
可以执行以下操作:
float presmax = (float)atof( strchr( TempStr, ' ' ) ;
仅由于您的问题专门要求float
并且atof()
返回double
才需要强制类型转换。强制转换在任何情况下都是隐式的,所以:
float presmax = atof( strchr( TempStr, ' ' ) ;
也是可以接受的。
strchr()
返回指向第一个空格字符的指针,而atof()
忽略任何前导空格。如果您的配置文件可能使用TAB字符,则:
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 ) ;