【发布时间】:2010-01-07 19:35:13
【问题描述】:
如何以最简单的方式检查从函数scanf 初始化的整数是否为数字?
【问题讨论】:
-
我相信这个问题回答了你的问题。 stackoverflow.com/questions/456303/…
-
我将问题解读为“读取的字符串是否为有效整数”。
标签: c
如何以最简单的方式检查从函数scanf 初始化的整数是否为数字?
【问题讨论】:
标签: c
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;
}
【讨论】:
sscanf 和 scanf 是个坏主意。两者都会在溢出时产生未定义的行为。
scanf("%d", &v) 的调用将失败(返回 0)并且不会从流中删除违规字符。使用fgets() 将输入读取为文本,然后使用strtol()(或strtod(),如果需要浮点数)进行转换。
scanf() 的签名不正确)。
你的问题措辞奇怪。一个初始化的整数总是一个数字(除了陷阱表示的特殊情况),这意味着不需要检查任何东西。
我猜你需要检查给定的 string 是否是数字的有效表示。为此,您首先需要定义有效表示应该是什么样子。你允许签名吗?是否允许使用多余的+(作为标志)? 0x 十六进制前缀呢?以此类推。
C 语言提供了自己的一组规则,这些规则定义了该语言关于整数的有效字符串表示的想法。如果这就是您所需要的,那么为了验证给定的字符串是否满足这些规则,最好的方法是使用字符串到整数的转换函数,如strtol(以及来自strto... 组的其他函数),然后检查错误条件。
请注意那些建议编写您自己的函数来验证这些规则的答案。这没有任何意义,因为标准功能已经存在。此外,严格来说,在实际编程中,很少需要在没有实际转换的情况下执行验证。 strto... 两者都可以。
此外,请远离 scanf 组中的函数来执行字符串到整数的转换。这些函数在溢出时产生未定义的行为(即,如果输入字符串表示太长)。在一般情况下,在 C 中进行此类转换的唯一正确方法是来自 strto... 组的函数。
【讨论】: