在花了很多时间研究输入验证之后,我结合了一些想法并想出了这个:
检查字符串是否为有效的 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/