我们如何从scanf()的函数测试返回值?(how do we test the return va

2019-06-23 11:54发布

我想确认是否从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您可以检查是否转换的最后一个字符实际上是字符串被解析的结束。



文章来源: how do we test the return values from the scanf() function?
标签: c scanf