c - 使用 sscanf 将 "0x0"解析为两个数字

标签 c scanf

我创建了一个通用函数,用于将配置字符串中写入的值解析为 double 值。当有两个值要读取时,解析包含这两个值的文本行的函数将提供一个定界字符串 delim_str 以了解是什么将两个值分开。我首先通过执行 sprintf(fmt, "%%lg%s%%lg", delim_str); 创建格式字符串 fmt 来进行解析,然后我使用它通过 sscanf(input_string, fmt, &v1, &v2); 进行解析。

当我使用 delim_str 时一切正常,例如 "- "", ",当我使用它时出现问题使用 "x" 作为分隔符解析屏幕分辨率,它将像 1920x1080 这样的输入字符串解析为两个值,但如果第一个值为 0,则 0x1080 给我 v1 值 4224(0x1080 解释为十六进制值)而不是 0 并且 v2 未修改。

我可以考虑使用 strstr 在输入字符串中找到 delim_str 的开始,然后用它来创建两个新字符串,每个字符串一个,但是我感觉一定有更优雅的方法。

最佳答案

您可以使用 strtok/strtod 组合:strtok 获取两个字符串,然后 strtod 将其转换为所需的 double 格式。

它可能看起来像这样:

#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;
}

关于c - 使用 sscanf 将 "0x0"解析为两个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57508666/

相关文章:

c - 默认的 SIGINT 处理程序是如何在它的库定义中实现的?

c - 如何使 .txt 文件对 Visual C 可见

c - 使用scanf函数

c - C 中 fscanf() 的问题

c - 使用 sscanf 读取字符串

c - 如何使用 scanf() 在 C 中接受 char *

复数 (complex.h) 和明显的精度滞后

无法在 malloc() 处设置断点

c++ - 获取 Windows 7 任务栏中的窗口列表?

c - MpLab 链接错误 : Could Not Allocate Section (C30 Compiler)