我想知道在C语言中是否有将字符串转换为整数的替代方法。
我经常在我的代码中使用以下模式。
char s[] = "45";
int num = atoi(s);
那么,是否有更好或是另一种方法呢?
我想知道在C语言中是否有将字符串转换为整数的替代方法。
我经常在我的代码中使用以下模式。
char s[] = "45";
int num = atoi(s);
那么,是否有更好或是另一种方法呢?
这个函数将会帮助你
int strtoint_n(char* str, int n)
{
int sign = 1;
int place = 1;
int ret = 0;
int i;
for (i = n-1; i >= 0; i--, place *= 10)
{
int c = str[i];
switch (c)
{
case '-':
if (i == 0) sign = -1;
else return -1;
break;
default:
if (c >= '0' && c <= '9') ret += (c - '0') * place;
else return -1;
}
}
return sign * ret;
}
int strtoint(char* str)
{
char* temp = str;
int n = 0;
while (*temp != '\0')
{
n++;
temp++;
}
return strtoint_n(str, n);
}
参考:http://amscata.blogspot.com/2013/09/strnumstr-version-2.html
atoi
和类似函数的最大问题之一是,如果发生溢出,它的行为是未定义的。而你的函数没有检查这个问题。而strtol
和类似函数则会进行检查。 - chadtemplate <typename T>
T to(const std::string & s)
{
std::istringstream stm(s);
T result;
stm >> result;
if(stm.tellg() != s.size())
throw error;
return result;
}
是的,你可以直接存储整数:
int num = 45;
atoi
或strol
会赢得“最短代码量”比赛。strtol()
实际上需要相当多的代码。它可以返回 LONG_MIN
或 LONG_MAX
,无论是实际转换值还是发生下溢或上溢,而且它也可以返回 0,无论是实际值还是没有数字可转换。在调用之前,你需要设置 errno = 0
,并检查 endptr
。 - Keith Thompson