首页 > 解决方案 > 使用 sscanf 将“0x0”解析为两个数字

问题描述

我制作了一个通用函数,用于将配置字符串中写入的值解析为双精度值。当有两个值要读取时,会为解析包含这两个值的文本行的函数提供一个定界字符串delim_str,以了解两个值之间的区别。我首先通过 do 创建格式字符串fmtsprintf(fmt, "%%lg%s%%lg", delim_str);进行解析,然后通过 do 将其用于解析sscanf(input_string, fmt, &v1, &v2);

当我使用delim_str诸如" - "or时一切都很好", ",当我使用它来解析屏幕分辨率时会出现问题"x",它会将输入字符串解析1920x1080为两个值,但是如果第一个值为 0,那么给0x1080我一个v14224(0x1080 解释为十六进制值)而不是 0 并且v2未修改。

我可以考虑使用在输入字符串strstr中查找开头delim_str,然后使用它创建两个新字符串,每个变量一个,但我感觉必须有一种更优雅的方法。

标签: cscanf

解决方案


您可以使用 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;
}

推荐阅读