是否有`sscanf`的通用格式说明符?

时间:2016-05-26 10:41:08

标签: c scanf format-specifiers

我正在使用需要从文件中读取值的C(++)程序。这些值可以是整数(有符号或无符号)或浮点数。此时文件只包含十进制数字(整数),因为/\A(?<a>|.|(?:(?<b>.)\g<a>\k<b+0>))\z/ 格式说明符sscanf()似乎已足够。

但是将来文件可能包含所有类型的数字,如正数或负数(整数或浮点数),在后一种情况下,精度未知,收集前导或尾随零的存在,如下示例:

%d

是否有格式说明符可以涵盖所有这些案例,还是我在做梦?

由于

1 个答案:

答案 0 :(得分:0)

我认为不存在这样的魔术说明符,因为传递给sscanf()的参数类型是固定的。

无论可能的精度损失如何,整数都可以看作是浮点数(但反之亦然)。因此,如果您不关心输入是整数还是浮点数,只需使用fgets(input, BUFFER_SIZE, stdin);后跟scanf(input, "%lf", &dblVal);

但是,如果你真的在乎,这里有一个如何处理它们的例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFER_SIZE 80

int main(void)
{
    char *input = malloc(BUFFER_SIZE);
    char *endptr;
    fgets(input, BUFFER_SIZE, stdin);
    input[strcspn(input, "\n")] = '\0';

    long intVal = strtol(input, &endptr, 10);
    if(!*endptr)
    {
        // input is an integer
        printf("%ld", intVal);
    }
    else
    {
        // input is an floating point number
        double dblVal;
        int r, n;
        r = sscanf(input, " %lf%n", &dblVal, &n);
        if(r == 1 && n == strlen(input))
            printf("%g", dblVal);
        else
            puts("Invalid input");
    }
}