在objective-c中,我会将一个c字符串(不是NSStirng
)解析为int,同时还要检查该数字对于int来说是不是太大或太小了?
我找到了一些有用的参考资料:http://www.fefe.de/intof.html
但是我找不到能够告诉我如何执行此操作的示例代码。我尝试过使用strtoumax()
和UINT_MAX
,但没有找到足够清晰的示例,以便了解如何正确使用它们。
我也知道要避免atoi()
这样的事情是明智的吗?我认为如何使用long
,然后将其更改回int
,我感到很狡猾。另一件事是我已经完全删除了&& errno == ERANGE
因为它没有使用它。这也是明智的吗?
bool to_int(const char* str, int* val)
{
char* nptr = NULL;
long x = strtol(str, &nptr, 10);
printf("long %ld\n",x);
if (((x > INT_MAX) || (x < INT_MIN)))
return false; //Value is invalid..
*val = (int)x;
return true; // Value is valid
}
int main()
{
int val = 0;
char testVal[] = "2147483647";
if (to_int(testVal, &val))
{
printf("Valid integer: %d\n", val);
}
else
{
printf("Invalid integer %d\n", val);
}
}
return 0;
}
答案 0 :(得分:0)
#include <inttypes.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
bool to_int(const char* str, int* val) //Takes a string and a pointer to an int.
{
errno = 0;
*val = 0;
char* nptr = NULL;
long int lval = strtol(str, &nptr, 10);
if (((lval > INT_MAX) || (lval < INT_MIN) || (lval == LONG_MAX) || (lval == LONG_MIN)) && errno == ERANGE) //Check for ERANGE being set.
return false; //Value is invalid..
errno = 0;
*val = (int)lval;
return true; //Value is valid..
}
int main()
{
int val = 0;
if (to_int("2147483647", &val))
{
printf("Valid integer: %d", val);
}
else
{
printf("Invalid integer");
}
}