在objective-c中将c字符串解析为int,避免溢出

时间:2014-04-12 06:14:50

标签: c++ objective-c c parsing int

在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;
}

1 个答案:

答案 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");
    }
}