[技术干货]
C语言如何按任意进制数取出字符串中的长整数?strtol()!
>C 库函数 long int strtol(const char *str, char **ptr, int base) 把参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),base 必须介于 2 和 36(包含)之间,或者是特殊值 0。
有时候,我们需要将字符串中的数字转换成16进制数,这时我们可以使用strtol()
**头文件**
```c
#include <stdlib.h>
```
### **参数:**
>strtol(const char *str, char **ptr, int base)
- str -- 要转换为长整数的字符串。
- ptr -- 对类型为 char* 的对象的引用,其值由函数设置为 str 中数值后的下一个字符。
- base -- 基数,必须介于 2 和 36(包含)之间,或者是特殊值 0。
### **参数解析:**
strtol() 会将参数 str 字符串根据参数 base 来转换成长整型数(long)。参数 base 范围从2 至36,或0。base 代表 str 采用的进制方式,如base 值为10 则采用10 进制,若base 值为16 则采用16 进制等。
strtol() 会扫描参数 str 字符串,跳过前面的空白字符(例如空格),直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。
**两点注意:**
- 当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 '0x' / '0X' 前置字符则会使用 16 进制转换,遇到 '0' 前置字符则会使用 8 进制转换。
- 若ptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 ptr 传回;若 ptr 为 NULL,则表示该参数无效,或不使用该参数。
### 示例
>比如有这么一个字符串 “123456abcdefg”,我们需要取出长整数。
```c
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char str[15] = "123456abcdefg";
char *ptr;
long Number;
Number= strtol(str, &ptr, 10); //十进制
printf("取出来的长整数是 %ld\r\n", Number);
printf("剩下的字符串部分是 %s\r\n", ptr);
return 0;
}
```
**结果:**
```
取出来的长整数是 123456
剩下的字符串部分是 abcdefg
```
### 在单片机上的应用
在stm32的rtc时钟中,我们在进行网络对表时,需要往RTC时钟写入16进制的时间(BCD码),此时可以通过此函数进行转换