如何在C语言中将字符串转换为整数?

336

我想知道在C语言中是否有将字符串转换为整数的替代方法。

我经常在我的代码中使用以下模式。

char s[] = "45";

int num = atoi(s);

那么,是否有更好或是另一种方法呢?


1
http://www.programmingsimplified.com/c/source-code/c-program-convert-string-to-integer-without-using-atoi-function - Kyle Bridenstine
3
虽然这个方法可以工作,但并不是推荐的方式,因为它没有处理错误的方法。除非您可以百分之百地信任输入,否则永远不要在生产代码中使用它。 - Uwe Geuder
13个回答

-3

这个函数将会帮助你

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


1
为什么要这样做呢?atoi和类似函数的最大问题之一是,如果发生溢出,它的行为是未定义的。而你的函数没有检查这个问题。而strtol和类似函数则会进行检查。 - chad
1
是的。由于C不是Python,我希望使用C语言的人们能够意识到这种溢出错误。每个东西都有它自己的限制。 - Amith Chinthaka

-5
在C++中,您可以使用这样的函数:
template <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;
}

这可以帮助您将任何字符串转换为任何类型,如浮点数、整数、双精度等。

1
已经有一个涵盖C ++的类似问题的答案(https://dev59.com/yXVC5IYBdhLWcg3wvT_g#6154614),其中解释了这种方法的问题。 - Ben Voigt
由于此回答不相关,删除投票。 - Lundin
OP 特别要求使用 C 语言... - CoffeeTableEspresso

-8

是的,你可以直接存储整数:

int num = 45;

如果你必须解析一个字符串,atoistrol会赢得“最短代码量”比赛。

如果你想要安全地进行转换,strtol() 实际上需要相当多的代码。它可以返回 LONG_MINLONG_MAX,无论是实际转换值还是发生下溢或上溢,而且它也可以返回 0,无论是实际值还是没有数字可转换。在调用之前,你需要设置 errno = 0,并检查 endptr - Keith Thompson
给出的解析方案都不可行。 - BananaAcid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接