首页 > 解决方案 > 使用 sscanf 解析子字符串/浮点数

问题描述

我正在向调制解调器发送 AT 命令并得到此响应(我正在使用 C):

\r\nOK\r\n\r\n+RSRP: 164,6200,\"-090.20\",\r\r\n+RSRQ: 164,6200,\"-07.30\",\r\n\r\nOK\r\n

整行是一个 C 字符串。我需要使用 sscanf 读取引号中的值(-090.20 和 -07.30)。我真的很难过。你会如何解决这个问题?非常感谢!

标签: cparsing

解决方案


不是有scanf,还有一种可能:

您可以使用strtok来分隔想要的值atof并将它们转换为双精度值。请注意,不像strtod(使用起来有点复杂),atof不提供错误处理。可以使用以下函数提取值,例如:

#include <string.h> // For strtok
#include <stdlib.h> // For atof

void scanValues(char* input, double* value1, double* value2) {
    char* sep;
    
    sep = strtok(input, "\""); // replaces the first \" with \0
    sep = strtok(NULL, "\"");  // replaces the second \" with \0,
    *value1 = atof(sep);       // sep points to the first wanted value
    
    // Same for the second value:
    sep = strtok(NULL, "\"");
    sep = strtok(NULL, "\"");
    *value2 = atof(sep);
}

可以这样调用:

#include <stdio.h>  // For printf

int main() {
    double value1, value2;
    char input[] = "\r\nOK\r\n\r\n+RSRP: 164,6200,\"-090.20\",\r\r\n+RSRQ: 164,6200,\"-07.30\",\r\n\r\nOK\r\n";
    
    scanValues(input, &value1, &value2);
    
    printf("%f %f\n", value1, value2);
}

推荐阅读