我正在创建一个简单的控制台应用程序,其中char * argv []应该采用浮动数字的形式(例如5.234,7.197等)
为了确保程序只接收真正有效的float的用户输入,我创建了一个结合了sscanf(ref:character array to floating point conversion)和有效范围检查(ref:How can I check if a string can be converted to a float?)结果的函数。 / p>
//buffer comes from agrv[n]
char MyFloatCheck(char* buffer)
{
float f;
char result;
result = sscanf(buffer, "%f", &f);
result &= isRangeValid(buffer);
return result;
}
然后我用以下方法测试了上面的函数:
我的测试编号1,2和3(a)的结果是预期的:
然而,3(b)的结果未被预料到:
我的问题是: 1.为什么会这样? 2.有没有内置的方法来检查这种输入错误? 3.有没有完善的解决方法?
我正在考虑创建自己的函数来检查右端的字符是否包含无效字符,但如果有任何可用的内置方式,我宁愿使用它。
答案 0 :(得分:1)
正如您所注意到的,sscanf
逐个消耗字符并写入已在%f
中读取的数字,无论读取是否因输入字符串的结尾,空格,换行或信。
您可以从strtof
获得相同的行为,sscanf(buffer, "%f", &f);
的简单替代:
char *endptr;
f = strtof(buffer, &endptr);
以上两行为您提供了一种简单的方法,可以在调用strtof
后检查整个字符串是否已被消耗:
if (endptr != buffer && *endptr == 0) …
条件endptr != buffer
表示已读取浮点数。否则,f
为零,但这并不意味着什么,因为没有消耗任何字符。 *endptr == 0
表示在读取浮点数时消耗了整个输入缓冲区,这似乎是您要查找的内容。