strtol,strtoll,strtoul, strtoull字符串转化成数字
今天看kafka,有一个参数选项中有: 'S' seq=strtoull(optarg,NULL,10);
do_seq=1;
之后查找了下 strtoull 函数的功能,了解如下:
-----------------------------------
from:http://zengwu3915.blog.163.com/blog/static/27834897201262562912597/
名字:
strtol, strtoll, strtoul, strtoull
convert a string to a (signed, unsigned ) long integer string
声明:
#include<stdlib.h> ( 这个是C标准库,与linux无关。这套函数是通用的。)
long int strtol(const char *nptr, char **endptr, int base);
long long int strtoll(const char *nptr, char **endptr, int base);
unsigned long int strtoul(const char *nptr, char **endptr, int base);
unsigned long long int strtoull(const char *nptr, char **endptr, int base);
说明,第一个参数 nptr是要转化的字符串。第三个参数base说明nptr的进制。base 取值范围 0,2-36
这几个函数会忽略nptr前面的空格( ' ', '\t', '\n' '\f', '\v' '\r' ,由isspace判定为真的字符)
while (*nptr && isspace ( *nptr ) ) ++ nptr;
然后遇到非合法字符结束;
base = 2; 合法字符为0, 1
base = 3; 合法字符为0,1, 2
...
base = 11; 合法字符为0,1,...,9,a(A)
...
base = 36;合法字符为0, 1, ...,9,a(A),...,z(Z)。
字符 a-z,是忽略大小写的,混着来也行,例如 strtol("aA", NULL, 11)依然能得到正确的结果。
函数的第二个参数endptr可以为空,如果不为空,则 endptr 保存函数结束前的那个非合法字符的地址。
如果没有合法字符,则 *endptr = nptr,函数返回0.
例如:
1.
char *endptr;
char nptr[]="123abc";
int ret = strtol(npstr, &endptr, 10 );
由于10进制里没有“数字”a,所以扫描到a,结束。
这样 ret = 123;
endptr = &nptr[3]; ( printf("%s", endptr);将得到字符串 abc )
2.
char nptr[]=" \n\t abc";
int ret = strtol(nptr, &endptr, 10 );
由于函数会忽略nptr前面的空格(' ', '\n'...),所以,从字符a开始扫描,但是遇见的“第一个”即是不合法字符。
所以函数结束。 ret=0; endptr = nptr;
以下的讨论,会认为 nptr 前面没有空格,
即执行过类似于while (*nptr &&isspace ( *nptr ) ) ++ nptr;
如果base 为0.则分3种情况:
如果nptr 以0x(零x)开头,则把nptr当成16进制处理。
如果npstr以0(零)开头,则把nptr当成8进制处理。
否则,把nptr当成10进制。
对于函数执行错误,如传了一个非合法base,则errno会设置相关值