问题 检查scanf中的值是否为数字?


以最简单的方式,我如何检查是否从函数初始化了一个整数 scanf 是一个数字?


11312
2018-01-07 19:35


起源

我相信这个问题可以回答你的问题。 stackoverflow.com/questions/456303/... - hometoast
如果整数是一个数字? - Rubens Farias
我把这个问题读作“如果字符串读取是一个有效的整数。” - hometoast


答案:


http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

成功时,[scanf]返回   成功阅读的项目数量。这个   count可以匹配预期的数量   读数或更少,甚至为零,如果a   发生匹配失败。在这种情况下   任何数据之前的输入失败   可以成功阅读,EOF是   回。

所以你可以这样做:

#include <stdio.h>

int main()
{
    int v;
    if (scanf("%d", &v) == 1) {
        printf("OK\n");
    } else {
        printf("Not an integer.\n");
    }
    return 0;
}

但建议您使用 与fgets 和 与strtol 代替。


9
2018-01-07 19:37



谢谢man,它有效,但如果我把它放在一个循环中,不能正常工作,如果输入是一个字符串在开始,循环是无限的,我可以解决? - genesisxyz
我把一个getchar();里面...现在工作 - genesisxyz
sscanf 和 scanf 是个坏主意。两者都在溢出时产生未定义的行为。 - AnT
好点子。 strtol更好,但他确实问过如何使用scanf,所以我仍然认为我们应该告诉他他的问题的答案,即使我们建议他不要使用这种方法。 - Mark Byers
“%d”转换说明符将读取并转换为字符串中的第一个非数字字符。对于像“12w3”这样的输入,它会将“12”转换为12并将其分配给v,在输入流中保留字符串“w3”。由于'w'不是数字,因此将来会调用 scanf("%d", &v)将失败(返回0)并且不从流中删除有问题的字符。使用 fgets() 将输入作为文本读取,然后使用转换 strtol() (要么 strtod() 如果你需要花车)。 - John Bode


你的问题措辞奇怪。初始化的整数总是一个数字(除了异常情况下的陷​​阱表示),这意味着不需要检查任何东西。

我猜你需要检查是否给定  是数字的有效表示。为此,您首先需要定义有效表示应该是什么样子。你允许签名吗?是多余的 + 允许(作为标志)?关于什么 0x 十六进制的前缀?等等。

C语言提供了自己的一套规则,用于定义语言对整数的有效字符串表示的概念。如果那就是你需要的,那么为了验证给定的字符串是否满足这些规则,最好的方法是使用字符串到整数的转换函数 strtol (以及其他功能) strto... 组)然后检查错误情况。

请注意建议编写自己的函数来验证这些规则的答案。这没有任何意义,因为标准功能已经存在。而且,严格来说,在现实生活中,很少需要在没有实际转换的情况下执行验证。 strto... 会做两件事。

此外,远离功能 scanf group to perfrom string-to-integer conversion。这些函数在溢出时产生未定义的行为(即,如果输入字符串表示太长)。一般情况下,在C中进行这种转换的唯一正确方法是函数 strto... 组。


6
2018-01-07 20:03