char *argv - float/int 数字

char *argv - float/int numbers

我正在从 argv[1] 获取数字,应该区分 floatingint 数字。 所以我决定用 sscanf 来做。

试图将 string 转换为 float - 我失败了。 (如果它是 int 值,则不应包含在输出中。)

部分代码:

  float check;
  sscanf(argv[1], "%f", &check) == 1);
  if(check == 1){
     printf("is a float");
  }

问题是,sscanf returns 1 即使它是一个 int 值。如果 sscanf 是一个 int 值,我该如何阻止它返回 1?我也用strtod试过,又失败了。任何想法,我做错了什么?

此致,

凯塔

int值是float值,所以如果你想区分也是int的float值和不是int的float值,你需要先把它当作int来尝试。此外,如果任何前缀与说明符匹配,scanf 将 return 成功,并将忽略字符串末尾的额外内容。如果你不想那样,你需要使用 %n 并确保它已经消耗了整个字符串。所以你最终得到:

float checkf;
int checki, len;
if (sscanf(argv[1], "%d %n", &checki, &len) >= 1 && argv[1][len] == 0) {
    printf("%s is an int\n", argv[i]);
} else if (sscanf(argv[i], "%f %n", &checkf, &len) >= 1 && argv[i][len] == 0) {
    printf("%s is a float\n", argv[i]);
} else {
    printf("%s is neither an int nor a float\n", argv[i]);
}
格式字符串中的

%n 会导致 scanf 报告在格式中的那个点之前已经消耗了多少个输入字符——将它放在格式的末尾允许我们检查末尾格式的末尾与字符串的末尾匹配,并且输入中没有其他内容。在这种情况下,像 2.5 这样的浮点输入看起来像一个整数 2 后跟额外的字符串 .5 到第一个 scanf 调用,所以 scanf 会成功 (return 1) , 但 len 将设置为 . 的偏移量(因此 argv[i][len] 将是 '.',而不是 0)