我想检查用户输入的号码是否大于或低于告知值。
我知道atoll function,但它似乎并没有特别帮助,基于未定义的值检查并不太令人信服。
我也知道我可以检查用户输入的字符串是否都是数字,在这种情况下,我可以检查字符串的长度是否大于LLONG_MAX
或{{的长度1}}一旦左边的0s被移除,或者如果两者的长度相同,我可以逐位检查,如果该数字中输入的数字的值大于{{1}的值}或LLONG_MIN
它会超出范围。
但我想必须有更好的方法来做到这一点。希望你能给我一些关于这种方式的提示。
答案 0 :(得分:5)
改为使用strtoll
功能。
如果输入的值超出范围,errno
将设置为ERANGE
并返回LLONG_MIN
或LLONG_MAX
,具体取决于值是下溢还是溢出
来自man page:
strtol()
函数返回转换结果,除非 该值将下溢或溢出。如果发生下溢,strtol()
返回LONG_MIN
。如果发生溢出,strtol()
返回LONG_MAX
。在这两种情况下,errno
都设置为ERANGE
。恰恰 同样适用于strtoll()
(LLONG_MIN
和LLONG_MAX
而不是LONG_MIN
和LONG_MAX
)。
答案 1 :(得分:2)
使用strtol
。每the strtol
standard:
如果正确的值超出可表示值的范围,
{LONG_MIN}
,{LONG_MAX}
,{LLONG_MIN}
或{LLONG_MAX}
应为errno
返回(根据值的符号),[ERANGE]
设置为errno = 0; long long result = strtoll( inputStr, NULL, 0 ); if ( ( LLONG_MAX == result ) && ( ERANGE == errno ) ) { /* handle error */ ... }
。
所以:
echo -n "Mon= " read days[0]