通过从char *转换为int的整数验证

  • 本文关键字:int 整数 验证 转换 char c
  • 更新时间 :
  • 英文 :


说我对char *的整数输入无效,

char *ch = "23 45"

使用atoi(ch)23作为转换的输出,忽略空间和45。

我正在尝试对此输入进行测试。我该怎么做才能将其标记为无效的输入?

在将字符串传递给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).

缺乏错误检测是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 != '' && *end == '');
}

相关内容

最新更新