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

时间:2010-01-07 19:35:14

标签: c

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

2 个答案:

答案 0 :(得分:9)

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;
}

但建议你改用fgetsstrtol

答案 1 :(得分:6)

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

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

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

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

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