char * argv-浮点/整数数

问题描述 投票:0回答:1

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

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

部分代码:

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

问题是,即使sscanfint值,它也会返回1。如果它是sscanf值,如何阻止int返回1?我也用strtod尝试过,再次失败。任何想法,我在做什么错?

最诚挚的问候,

凯塔

scanf argv
1个回答
1
投票

Int值是浮点值,因此,如果要区分也是int的浮点值和不是int的浮点,则需要先将其作为int进行尝试。另外,如果任何前缀与说明符匹配,scanf将返回成功,并且将忽略字符串末尾的多余内容。如果您不希望这样做,则需要使用%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,后跟第一个scanf调用的额外字符串.5,因此scanf将成功(返回1),但len将被设置为.(因此argv[i][len]将是'.',而不是0)

© www.soinside.com 2019 - 2024. All rights reserved.