在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/

10-12 14:30