我正在使用需要从文件中读取值的C(++)程序。这些值可以是整数(有符号或无符号)或浮点数。此时文件只包含十进制数字(整数),因为/\A(?<a>|.|(?:(?<b>.)\g<a>\k<b+0>))\z/
格式说明符sscanf()
似乎已足够。
但是将来文件可能包含所有类型的数字,如正数或负数(整数或浮点数),在后一种情况下,精度未知,收集前导或尾随零的存在,如下示例:
%d
是否有格式说明符可以涵盖所有这些案例,还是我在做梦?
由于
答案 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");
}
}