本文将介绍strtol函数,参考linux programmer's manual,如有任何疑问请评论指出.
C 库函数 long int strtol(const char nptr, char endptr, int base) 把参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),base 必须介于 2 和 36(包含)之间,或者是特殊值 0。

声明

下面是 strtol() 函数的声明。
long int strtol(const char *nptr, char **endptr, int base);
参数
nptr -- 要转换为长整数的字符串。
endptr -- 对类型为 char* 的对象的引用,其值由函数设置为 str 中数值后的下一个字符。
base -- 基数,必须介于 2 和 36(包含)之间,或者是特殊值 0。
返回值
该函数返回转换后的长整数,如果没有执行有效的转换,则返回一个零值。
如果endptr不等于NULL,strtol()函数中*endptr保存着第一个非法字符的地址,如果没有待转换的字符*endptr保存着原始值。
strtoll()函数与strtol()函数唯一的不同是返回值是long long integer.
关于示例代码的讲解:
atoi()函数将字符串转换为整型.
perror(char *string):string为要输出的错误信息。
perror()用来将上一个函数发生错误的原因输出到标准错误(stderr)。参数string所指的字符串会先打印出,后面再加上错误原因字符串,此错误原因依照全局变量errno 的值来决定要输出的字符串。


       #include <stdlib.h>
       #include <limits.h>
       #include <stdio.h>
       #include <errno.h>

       int
       main(int argc, char *argv[])
       {
           int base;
           char *endptr, *str;
           long val;

           if (argc < 2) {
               fprintf(stderr, "Usage: %s str [base]\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           str = argv[1];
           base = (argc > 2) ? atoi(argv[2]) : 10;

           errno = 0;    /* To distinguish success/failure after call */
           val = strtol(str, &endptr, base);

           /* Check for various possible errors */

           if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
                   || (errno != 0 && val == 0)) {
               perror("strtol");
               exit(EXIT_FAILURE);
           }

         if (endptr == str) {
               fprintf(stderr, "No digits were found\n");
               exit(EXIT_FAILURE);
           }

           /* If we got here, strtol() successfully parsed a number */

           printf("strtol() returned %ld,*endptr is %d\n", val,*endptr);

           if (*endptr != '\0')        /* Not necessarily an error... */
               printf("Further characters after number: %s\n", endptr);

           exit(EXIT_SUCCESS);
       }

上面代码中在strtol()执行成功打印val值时我们添加了打印出*endptr的值,方便理解strtol函数。
编译之后执行 ./a.out 10abcde 10
输出结果:
strtol() returned 10,*endptr is 97
Further characters after number: abcde
原因如下,参考man strtol
If endptr is not NULL, strtol() stores the address of the first invalid character in *endptr. If there were no digits at all, strtol() stores the original value of nptr in *endptr (and returns 0). In particular, if *nptr is not '\0' but **endptr is '\0' on return, the entire string is valid.
如果endptr非空,endptr中保存着第一个不能转换的字符的地址,因此上面10进制中a不能转换,故*endptr是97.