c - 使用 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)。我真的很难过。你会如何解决这个问题?非常感谢!
解决方案
不是有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);
}
推荐阅读
- java - 在退出请求的有效负载表单 HttpServeletRequest 时抛出 Java Lang 非法状态异常
- laravel - 下载此文件前如何显示白皮书(数据)pdf文件
- javascript - 如何在同一页面的多个实例上使用 localStorage 事件监听器?
- c - 数组将 2 个值存储在一个“位置”
- java - 如何在页面对象模型类-Java 中使用鼠标悬停动作?
- c# - Client-Unet 中未收到广播
- javascript - 仅在输入 3 个字符后显示自动完成
- python - 终止在 voip 应用程序中播放铃声的线程
- windows - grep 这个,但不是这个(windows)
- java - 多线程访问物化视图:同时刷新和读取似乎会导致不一致的行为