从字符数组中浮动检查限制,前后字符检查

时间:2016-02-07 03:24:11

标签: c arrays floating-point

我正在创建一个简单的控制台应用程序,其中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. 有效输入:12.15
  2. 非常大的输入:4 x 10 ^ 40
  3. 无效输入:(a)ab19.114,(b)19.114ab
  4. 我的测试编号1,2和3(a)的结果是预期的:

    1. 1
    2. 0(因为它太大了)
    3. (a)0(因为它包含数字前面的无效字符)
    4. 然而,3(b)的结果未被预料到:

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

        我正在考虑创建自己的函数来检查右端的字符是否包含无效字符,但如果有任何可用的内置方式,我宁愿使用它。

1 个答案:

答案 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表示在读取浮点数时消耗了整个输入缓冲区,这似乎是您要查找的内容。