【问题标题】:Is there a general format specifier for `sscanf`?`sscanf` 有通用格式说明符吗?
【发布时间】:2016-05-26 10:41:07
【问题描述】:

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

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

1
+2
-34
12.5
-13.5
+00014.31000000

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

谢谢

【问题讨论】:

  • 你在做梦......使用fgets()
  • 连同值一起提供值的类型,或者先检查浮动格式,如果失败,检查整数。
  • 对于 c++ 你可以使用cin <<
  • 这个魔术说明符会将其结果存储在什么数据类型的变量中?
  • 只需使用浮点类型的浮点说明符即可。毕竟浮点类型可以保存整数。

标签: c scanf format-specifiers


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2013-08-28
    相关资源
    最近更新 更多