c - 使用 sscanf 将“0x0”解析为两个数字
问题描述
我制作了一个通用函数,用于将配置字符串中写入的值解析为双精度值。当有两个值要读取时,会为解析包含这两个值的文本行的函数提供一个定界字符串delim_str
,以了解两个值之间的区别。我首先通过 do 创建格式字符串fmt
来sprintf(fmt, "%%lg%s%%lg", delim_str);
进行解析,然后通过 do 将其用于解析sscanf(input_string, fmt, &v1, &v2);
。
当我使用delim_str
诸如" - "
or时一切都很好", "
,当我使用它来解析屏幕分辨率时会出现问题"x"
,它会将输入字符串解析1920x1080
为两个值,但是如果第一个值为 0,那么给0x1080
我一个v1
4224(0x1080 解释为十六进制值)而不是 0 并且v2
未修改。
我可以考虑使用在输入字符串strstr
中查找开头delim_str
,然后使用它创建两个新字符串,每个变量一个,但我感觉必须有一种更优雅的方法。
解决方案
您可以使用 strtok/strtod 组合:strtok
获取两个字符串,然后strtod
将其转换为所需的双精度格式。
它可能看起来像这样:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char input_string[] = "0x1080";
char delim_str[] = "x";
char *v1str = NULL;
char *v2str = NULL;
v1str = strtok(input_string, delim_str);
if(v1str != NULL) {
v2str = strtok(NULL, delim_str);
}
if(!v1str || !v2str) {
fprintf(stderr, "format error");
exit(1);
}
double v1 = strtod(v1str, NULL);
double v2 = strtod(v2str, NULL);
printf("%f %f", v1, v2);
return 0;
}
推荐阅读
- ios - 动画后更改 ViewController
- ios - 应用重启后未调用 iOS OneSignal handleNotificationReceived 回调
- mongodb - 如何对具有特定字段日期mongodb的记录进行排序?
- npm - 持续的笑话错误:需要 Babel“^7.0.0-0”,但加载了“6.26.3”
- html - HTML 导航栏标题宽度
- python - Python - 在数据框中查找具有相同 ID 的元素并将其组合在一起
- javascript - 从 for 循环访问新的 Object() 值
- pyspark - pyspark - kafka 流 - 内存不足
- matlab - 使用向量元素选择矩阵元素
- ios - iPhone 10 全屏摄像头无法正常工作 Xcode // iPhone 10 与 iPhone 8