c++ - 这是使用浮点值进行输入验证的正确方法吗?

标签 c++ validation input floating-point

在花了很多时间研究输入验证之后,我结合了一些想法并想出了这个:

检查字符串是否为有效的 double...

的函数
bool isDouble(double& destination, string& source)
{ // 64 bit
  bool goodValue = false;

  if (!source.empty()) {
    errno = 0;
    char *garbage = nullptr;
    destination = strtod(source.c_str(), &garbage);

    if (*garbage == '\0' && errno != ERANGE)
      goodValue = true;
  }

  return goodValue;
}

函数检查字符串是否为有效的 32 位 integer...

bool isLong(long& destination, string& source)
{ // 32 bit (base 10)
  const short BASE = 10;
  bool goodValue = false;

  if (!source.empty()) {
    errno = 0;
    char* garbage = nullptr;
    destination = strtol(source.c_str(), &garbage, BASE);

    if (*garbage == '\0' && errno != ERANGE)
      goodValue = true;
  }

  return goodValue;
}

实现示例

using namespace std;

int main() {
  string buffer;
  double value;

  cout << "Enter a value: ";
  getline(cin, buffer, '\n');

  if (isDouble(value, buffer))
    cout << "Value: " << value << endl;
  else
    cout << "ERROR: Invalid input\n";

  return 0;
}

任何人都可以评论我是否忽略了这种方法的任何内容?

最佳答案

我不确定“那个”正确的方法,但我肯定不会这样做。首先,可能也是最明显的,这段代码:

    for (i = 0, d = 0; i < BUFFSIZE && buffer[i] != 0 && buffer[i] >= '0' &&
             buffer[i] <= '9' || (buffer[i] == '.' && d == 0); i++)
            if (buffer[i] == '.') ++d;

在几个地方重复(至少我认为另一个实例是相同的,而且可能无论如何都应该是)。

其次,您似乎不允许像 1e23-1.2 这样的数字,它们通常被接受为 float 。

顺便说一下,我想我会使用 strtod 来尝试转换输入。您可以使用它的第二个参数来检测转换是否到达输入字符串的末尾(如果没有,您将知道至少部分输入未被接受)。然后,您(显然)想要检查返回值是否在所需范围内。

关于c++ - 这是使用浮点值进行输入验证的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7693484/

相关文章:

c++结构指针在初始化为NULL时无法读取内存

c++ - 在 C++ 中创建 trie/suffix 树时减少内存使用

c++ - std::auto_ptr 如何与 C++/树映射一起使用

iphone - 电话号码的 NSTextCheckingResult

javascript - 是的,数组验证 - 仅当数组长度大于 1 时才需要值

php - Cakephp 3.0 表单验证

javascript - 我可以从 &lt;input type ="date"> 访问显示给用户的区域设置格式的字符串吗?

input - 双鼠标输入 - 模拟多点触控

c++ - 我可以通过 API 设置 QT_AUTO_SCREEN_SCALE_FACTOR 行为吗?

java - 如何更好地编写以下 Java 代码?