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

Is there a general format specifier for `sscanf`?

我正在使用 C(++) 程序,它需要从文件中读取值。这些值可以是整数(有符号或无符号)或浮点数。目前文件只包含十进制数字(整数),因为 sscanf() 格式说明符 %d 似乎就足够了。

然而,将来文件可能包含各种数字,如正数或负数(整数或浮点数),在后一种情况下,精度未知,也不知道前导零或尾随零的存在,因为在以下示例中:

1
+2
-34
12.5
-13.5
+00014.31000000

是否有一个格式说明符可以涵盖所有这些情况,还是我在做梦?

谢谢

我不认为存在这样一个神奇的说明符,因为你传递给 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")] = '[=10=]';

    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");
    }
}