假设我有一个无效的整数输入到char *,其中,
atoi(ch)
使用23
将function getUserInfo() {
username = document.getElementById("username").value;
password = document.getElementById("password").value;
"{% url 'user_authentication' %}"
}
作为转换后的输出,忽略空格和45。
我正在尝试对此输入进行测试。如何将其标记为无效输入?
答案 0 :(得分:3)
在将字符串传递给atoi()
或使用strtol()
之前检查字符串,但后者将返回long int
。
使用strtol()
,您可以检查错误:
RETURN VALUE
The strtol() function returns the result of the conversion, unless the value would underflow or overflow. If an underflow occurs, strtol() returns LONG_MIN. If an overflow
occurs, strtol() returns LONG_MAX. In both cases, errno is set to ERANGE. Precisely the same holds for strtoll() (with LLONG_MIN and LLONG_MAX instead of LONG_MIN and
LONG_MAX).
ERRORS
EINVAL (not in C99) The given base contains an unsupported value.
ERANGE The resulting value was out of range.
The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned).
答案 1 :(得分:2)
缺少错误检测是atoi()
功能的主要缺点之一。如果这是您需要的,那么基本答案是“不要使用atoi()
。”
strtol()
函数几乎在所有方面都是更好的选择。为了您的特殊目的,您可以向它传递一个指向char *
的指针,其中它将记录指向输入中未转换的第一个字符的指针。如果整个字符串成功转换,那么将存储指向字符串终止符的指针,因此您可以编写
_Bool is_valid_int(const char *to_test) {
// assumes to_test is not NULL
char *end;
long int result = strtol(to_test, &end, 10);
return (*to_test != '\0' && *end == '\0');
}