函数声明
long int strtol (const char* str, char** endptr, int base);
参数1:str
——字符串,函数会从合法的字符开始识别,之前的空格字符会被跳过,合法字符串会被转换为long int, 作为函数的返回值。
参数2:endptr
——字符指针的地址,如果该参数非NULL,则保存一个指向转换值后面的第一个指针。这个指针方便对字符串剩余的部分进行处理。
参数3:base——转换所执行的基数,说人话就是,base将决定以多少进制来看待str里的字符串。
base值的可选范围:0和2~36。
如果base为2,合法的字符就是’0’,‘1’。
对于base11到36,字母A~Z将被解释为数值10到35。
如果base为16,那么合法字符为’0’~‘9’,‘a’,‘b’,‘c’,‘d’,‘e’,‘f’。
总结:
该函数首先丢弃必要的空格字符,直到找到第一个非空格字符。然后,从这个字符开始,根据依赖于base取尽可能多的有效字符,并将它们解释为十进制数值。最后,一个指向str中整数表示后第一个字符的指针存储在endptr所指向的对象中。
例1
int main()
{
char buffer[] = " 0110";
int i = strtol(buffer, NULL, 2);
printf("%d\n",i);
}
输出:
字符串前置的空格将会被跳过,然后根据2进制只识别字符’0’,‘1’。然后转换为10进制。
例2:
int main()
{
char buffer[] = " a0110";
int i = strtol(buffer, NULL, 2);
printf("%d\n",i);
}
输出:
不能执行有效的转换,返回0。
例3
int main()
{
char buffer[] = "1033a";
char* stop;
int i = strtol(buffer, &stop, 2);
printf("%d\n",i);
printf("%s\n",stop);
}
例4
int main()
{
char buffer[] = "ffg";
char* stop;
int i = strtol(buffer, &stop, 16);
printf("%d\n",i);
printf("%s\n",stop);
}
base为0的情况
如果base为0,一般情况下是以十进制识别str中合法的字符,即’0’-‘10’。
但是有两个特殊情况,
当字符串的前缀为0,base为0情况下,则与base=8的情况一样,以八进制转换字符串中的合法字符。
如果str前缀不是0,则base=0和base=10的结果是一样的
同理,如果前缀为0x(0X),则base=0和base=16效果是一样的
没有前缀,则base=0视为base=10
此时,对于十进制来说,'f’是无法识别的。
注意:
当base>=34时,前缀0x中的字符’x’会被识别成数值33。
endptr的妙用
可将各类2~36进制数,转换为10进制
int main()
{
char buffer[] = "1010 77 ff z";
char* stop=buffer;
int i1 = strtol(stop, &stop, 2);
int i2 = strtol(stop, &stop, 8);
int i3 = strtol(stop, &stop, 16);
int i4 = strtol(stop, &stop, 36);
printf("十进制表示为:%d,%d,%d,%d", i1, i2, i3, i4);
return 0;
}