【问题标题】:Check if a value from scanf is a number?检查 scanf 的值是否是数字?
【发布时间】:2010-01-07 19:35:13
【问题描述】:

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

【问题讨论】:

标签: c


【解决方案1】:

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

成功时,[scanf] 返回 成功读取的项目数。这 count 可以匹配预期的数量 读数或更少,甚至为零,如果 发生匹配失败。在这种情况下 任何数据之前的输入失败 可以成功读取,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

【讨论】:

  • 谢谢,它可以工作,但如果我把它放在一个循环中,就不能正常工作,如果输入是开头的字符串,循环是无限的,我可以解决吗?
  • sscanfscanf 是个坏主意。两者都会在溢出时产生未定义的行为。
  • 好点。 strtol 更好,但他确实问了如何使用 scanf,所以我仍然认为我们应该告诉他问题的答案,即使我们建议他不要使用这种方法。
  • “%d”转换说明符将读取并转换为字符串中的第一个非数字字符。对于像“12w3”这样的输入,它将“12”转换为12并将其分配给v,将字符串“w3”留在输入流中。由于 'w' 不是数字,未来对 scanf("%d", &amp;v) 的调用将失败(返回 0)并且不会从流中删除违规字符。使用fgets() 将输入读取为文本,然后使用strtol()(或strtod(),如果需要浮点数)进行转换。
  • 对于 C 问题,请不要链接到 C++ 文档。尤其是不要链接到不正确的文档(文档给出的scanf() 的签名不正确)。
【解决方案2】:

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

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

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

请注意那些建议编写您自己的函数来验证这些规则的答案。这没有任何意义,因为标准功能已经存在。此外,严格来说,在实际编程中,很少需要在没有实际转换的情况下执行验证。 strto... 两者都可以。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 2017-07-16
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2012-10-29
    相关资源
    最近更新 更多