这是我在写一个百度之星题目时顺带写出来的,因为系统自带的atoi函数太弱,处理不了大的数,所以自己写了个更强劲的。代码如下,里面对函数也都有说明,有任何问题请留言,谢谢!

我用的是Arch Linux系统,vim编辑,gcc编译。

#include <stdlib.h>

//str2l.h
//主函数为double str2l(char s[]),通过调用此函数来进行操作。

//double str2l(char src[])
//参数为需要操作的字符串。需要操作的字符串必须介于-9223372036854775808和9223372036854775807之间,即-2^63和2^63-1之间,此范围外的数据参与转换所得结果不正确。函数对传入的实参进行判断符号,并设定转换起始位置以避开其符号,之后将字符串、起始位置、字符串长度作为参数传递给cha()函数进行数值转换,获得其long类型返回结果后将结果添加符号后返回给调用程序。

//double cha(char in[], int begin, int length)
//参数为字符串、起始位置、字符串长度。在函数中会对字符串中字符进行判断是否为数字,如果是数字则进行计算,返回long类型的数据,如果发现非数字字符则强制退出程序。程序正常返回结果为字符串转换后所得long类型的数据。

// By 陈志东 From 南京工业大学外语学院
// 2010年7月12日

long cha(char in[], int begin, int length){
    int a;
    long tmp;
    tmp=0;
    for(a=begin;a<length;a++){   
        if(in[a]>='0' && in[a]<='9'){
            tmp=10*tmp+(in[a]-'0');
        }
        else{
            //printf("It's not a integer\n");
            exit(1);
        }
    }
    return tmp;
}

long str2l(char src[]){
    int i,len;
    long result=0;
    len=strlen(src);
    if(src[0]=='-'){
        result=cha(src,1,len)*(-1);
    }
    else if(src[0]=='+'){
        result=cha(src,1,len);
    }
    else{
        result=cha(src,0,len);
    }
    return result;
}

//End

以下是测试函数:

#include <stdio.h>
#include "str2l.h"

int main(int argc,char * argv[]){
    if(argc!=2){
        printf("Plus a number no more than 22 digits after the CMD!\n");
        return 0;
    }
    long tmp;
    tmp=str2l(argv[1]);
    printf("the finale answer is %ld\n",tmp);
    return 0;
}
//End

如果你有更强劲更简单的方法,欢迎留言告知,感激不尽!