Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在objective-c中将c字符串解析为int避免溢出_C++_Objective C_C_Parsing_Int - Fatal编程技术网

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

C++ 在objective-c中将c字符串解析为int避免溢出,c++,objective-c,c,parsing,int,C++,Objective C,C,Parsing,Int,在objective-c中,我会将一个c字符串(不是NSStirng)解析为一个int,同时检查这个数字对于int来说是不是太大或太小 我发现了一些有用的参考资料,如: 但我还没有找到一段示例代码来演示如何做到这一点。我尝试过使用strotumax()和UINT\u MAX,但没有找到足够清晰的示例来了解如何正确使用它们 我还知道要避免atoi() 更新日期2014.04.12 这样做明智吗?我认为我使用long然后将其改回int是不明智的。另一件事是,我已经完全删除了&&errno==ERAN

在objective-c中,我会将一个c字符串(不是
NSStirng
)解析为一个int,同时检查这个数字对于int来说是不是太大或太小

我发现了一些有用的参考资料,如:

但我还没有找到一段示例代码来演示如何做到这一点。我尝试过使用
strotumax()
UINT\u 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;
}
bool to_int(const char*str,int*val)
{     
char*nptr=NULL;
长x=strtol(str和nptr,10);
printf(“长%ld\n”,x);
如果((x>INT_MAX)| |(x
#包括
#包括
#包括
#包括
bool to_int(const char*str,int*val)//接受一个字符串和一个指向int的指针。
{
errno=0;
*val=0;
char*nptr=NULL;
长整型lval=strtol(str和nptr,10);
如果((lval>INT_MAX)|(lval
在调用
strtol()
之前必须设置
errno=0
,因为成功的转换不会重置errno。注意
strtol
返回的是
long
,而不是
int
。您可能不应该假设这些类型是等效的,因为在某些平台上,
int
是32位,
long
是64位,这将使您的错误检查代码不正确。您是对的@RichardJ.RossIII我需要专门转换为int-not-to-long。对于ints,还有其他解决方法吗?也许使用INT_MAX/INT_MIN?啊,完全忘记了。原因是我用了:作为向导。。而std::stoi直接使用它。。我忘了检查
INT\u MAX
INT\u MIN
。不管怎样,我已经修好了。现在应该安全多了。第一组or语句甚至可能不需要进行
LONG\u MIN
LONG\u MAX
比较。。它也短路了,所以我怀疑它能否到达那里。我使用了
strtol
,因为
strtoimax
没有像文档中所说的那样设置
errno
:l@CantChooseUsernames使用更新的代码,我需要删除“&&errno==ERANGE”子句,以使其正确检测有效整数。如果我将测试字符串设置为“2147483648”,它将告诉我-2147483648是一个有效的整数,删除ERANGE检查可以解决这个问题。如果我打印F值,我得到的值是34。我不知道那里发生了什么事。我使用的是XCode 5.1
#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");
    }
}