【问题标题】:Float Checking from Char Array for Limit, Character Checking Front and Back从字符数组检查浮点数的限制,字符检查前后
【发布时间】:2016-02-07 03:24:10
【问题描述】:

我正在创建一个简单的控制台应用程序,它的 char *argv[] 应该是浮点数的形式(例如 5.234、7.197 等)

为了确保程序只接收真正有效的浮点数的用户输入,我创建了一个结合 sscanf(参考:character array to floating point conversion)和有效范围检查(参考:How can I check if a string can be converted to a float?)结果的函数。

//buffer comes from agrv[n]
char MyFloatCheck(char* buffer)
{
    float f;
    char result;
    result = sscanf(buffer, "%f", &f);
    result &= isRangeValid(buffer);
    return result;
}

然后我测试了上面的函数:

  1. 有效输入:12.15
  2. 非常大的输入:4 x 10^40
  3. 输入无效:(a) ab19.114, (b) 19.114ab

我的测试 1、2 和 3(a) 的结果是预期的:

  1. 1
  2. 0(因为太大了)
  3. (a) 0(因为它包含数字前面的无效字符)

但是 3 (b) 的结果出乎意料:

  1. (b) 1 (??)

我的问题是: 1. 为什么会这样? 2. 有没有内置的方法来检查这种输入错误? 3. 有没有完善的解决方法?

我正在考虑制作自己的函数,从右端检查字符以查看它是否包含无效字符,但如果有任何可用的内置方法,我宁愿使用它。

【问题讨论】:

标签: c arrays floating-point


【解决方案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 表示整个输入缓冲区都用于读取浮点数,这似乎是您要查找的内容。

【讨论】:

  • 感谢您的回答。这听起来合乎逻辑......不幸的是,我现在不在我的笔记本电脑上......几天后将回来进行检查。不过,您将首先获得我的支持..再次感谢..
猜你喜欢
  • 2021-11-09
  • 2013-03-26
  • 2018-03-20
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 2020-06-27
  • 2022-01-10
相关资源
最近更新 更多