如何检查用户输入的号码是否大于LLONG_MAX或LOWER而不是LLONG_MIN?

时间:2016-11-03 16:36:54

标签: c limits

我想检查用户输入的号码是否大于或低于告知值。

我知道atoll function,但它似乎并没有特别帮助,基于未定义的值检查并不太令人信服。

我也知道我可以检查用户输入的字符串是否都是数字,在这种情况下,我可以检查字符串的长度是否大于LLONG_MAX或{{的长度1}}一旦左边的0s被移除,或者如果两者的长度相同,我可以逐位检查,如果该数字中输入的数字的值大于{{1}的值}或LLONG_MIN它会超出范围。

但我想必须有更好的方法来做到这一点。希望你能给我一些关于这种方式的提示。

2 个答案:

答案 0 :(得分:5)

改为使用strtoll功能。

如果输入的值超出范围,errno将设置为ERANGE并返回LLONG_MINLLONG_MAX,具体取决于值是下溢还是溢出

来自man page

  

strtol()函数返回转换结果,除非   该值将下溢或溢出。如果发生下溢,   strtol()返回LONG_MIN。如果发生溢出,strtol()   返回LONG_MAX。在这两种情况下,errno都设置为ERANGE。恰恰   同样适用于strtoll()LLONG_MINLLONG_MAX   而不是LONG_MINLONG_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]