在Objective-C中,我会解析一个c字符串(不是NSStirng
)到一个int,同时还要检查一个int的数字是否太大或太小?
我发现了一些有用的参考,例如:http://www.fefe.de/intof.html
但是我无法找到示例代码来向我展示如何执行此操作。我尝试过使用strtoumax()
和UINT_MAX
,但是没有找到足够清晰的示例以了解如何正确使用它们。
我也知道避免atoi()
更新2014.04.12
是这样的明智吗?我认为在使用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;
}
最佳答案
#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");
}
}
关于c++ - 在 objective-c 中将c字符串解析为int以避免溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23026835/