我想确认是否从scanf()的函数返回的值是一个浮点数与否。 我怎样才能做到这一点? 我的代码不运行,因为它应该,如果错误的数据类型提供给scanf()的函数。 同样地,我怎么会确认是否返回的值是一个字符串或没有?
Answer 1:
scanf()
等返回成功的转换次数。
如果你有:
scanf("%f", &f);
你应该测试:
if (scanf("%f", &f) == 1)
...all OK...
else
...EOF or conversion failure...
如果你有几个转换,检查,他们都完成了。 如果你使用%n
“转换”,他们是不计算在内。
虽然scanf()
并在EOF返回EOF,你不应该测试-你应该经常检查主要是,你有你的预期转换次数。 例如,考虑bug的代码:
while (scanf("%f %d %s", &f, &i, s) != EOF) // Here be BUGS!
...loop body...
如果您键入3.14 x23 yes
,那么你将有一个无限循环,因为scanf()
将在第一次迭代返回1(它成功地转换3.14),并且此后0(不EOF)。
你可能会用OK:
while ((rc = scanf("%f %d %s", &f, &i, s)) != EOF)
{
if (rc != 3)
...oops data problems...
else
...all OK...
}
从前面的问题来看,你应该考虑使用fgets()
或可能POSIX getline()
来读取数据行,然后使用sscanf()
或类似的偶函数strtol()
和strtod()
来读取特定值行。 如果您使用sscanf()
在评论上述有关检查成功转换的数量仍然适用作出。
我不使用scanf()
在生产代码; 它仅仅是太艰难了适当控制。 我认为这是几乎适合入门程序 - 除了它会导致很多混乱。 就整体而言,最好的建议是“独善其身scanf()
和fscanf()
”。 需要注意的是,这并不意味着你必须保持清晰的sscanf()
但与甚至需要一些谨慎sscanf()
Answer 2:
返回值scanf
表示成功读取并分配给你的变量,或EOF的项目数:
这些函数返回成功匹配,并分配输入项目,其可为少于规定的,或甚至零在早期匹配失败的情况下的数量。
值返回EOF如果第一转换成功或匹配故障发生之前达到输入的结束。 如果发生读取错误,在这种情况下,数据流的错误指示器(参见FERROR(3))被设置,并且设置errno指明错误也被返回EOF。
如果int
由归国scanf
具有比输入符的量越少值(或至少传递需要一个参数说明符)格式字符串,那么你可以假设出了问题。
但是,如果要执行你的浮点数的更加彻底的验证,那么你应该考虑使用strtod()
即。 对于输入"1.23abc"
, scanf
将存储1.23
到您的变量,并告诉你,一切都很顺利,但strtod
您可以检查是否转换的最后一个字符实际上是字符串被解析的结束。