我正在从argv[1]
中获取数字,应该在floating
和int
数字之间进行区分。所以我决定用sscanf
来做。
尝试将string
转换为float
-我失败了。(如果它是int
值,则不应将其包含在输出中。)
部分代码:
float check;
sscanf(argv[1], "%f", &check) == 1);
if(check == 1){
printf("is a float");
}
问题是,即使sscanf
是int
值,它也会返回1。如果它是sscanf
值,如何阻止int
返回1?我也用strtod
尝试过,再次失败。任何想法,我在做什么错?
最诚挚的问候,
凯塔
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)