`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");
}
}
我正在使用 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");
}
}