前言
在学习free type的时候遇到strtoul()函数的使用,记录一下学习结果
一、函数原型
unsigned long strtoul(const char* nptr, char** endptr, int base);
nptr:要转换的字符串
endptr:一个指向字符指针的指针,用于指示转换结束后未使用的字符部分。如果为NULL,不会返回未使用的字符。
base:表示进制,可以是 0,2,8,10 或 16。如果设置为0,则根据字符串的前缀(0x或0X表示16进制,0表示8进制)来自动判断进制。否则,根据给定的进制进行转换。
二、函数功能实现原理
strtoul
从字符串的开头开始扫描,跳过前导的空格字符(空格、制表符)- 遇到正负号,会自动解释为非法字符,停止扫描并返回0
- strtoul将数字字符逐个转换为数字,并计算结果。遇到非数字字符,或达到字符串末尾,停止转换
- 如果遇到非法字符,
endptr
将指向该字符位置,除非endptr
为NULL。 - 如果没有转换任何数字字符,
strtoul
返回0,并将endptr
设置为nptr
的值.
三、函数的测试代码
#include <stdio.h>
#include <stdlib.h>
int main() {
const char* str1 = " 12345abc789";//有前导、非数字字符
const char* str2 = "abc789";//有前导、非数字字符
const char* str3 = "+-123456abc789";//正负号判断对非法字符
const char* str4 = "100123abc";//2进制显示,到了2就开始非法,应输出B1001的十进制数值9
const char* str5 = "123456789abc";//8进制显示 到了8就开始非法,应输出O1234567的十进制数值342391
char* end;
unsigned long str1_num , str2_num , str3_num , str4_num, str5_num;
str1_num = strtoul(str1, &end, 10);//将字符串里的十进制数字返回给num
printf("str1 转换的数字字符: %lu\n", str1_num);
printf("str1 剩余字符 : %s\n", end);//整个字符串的剩余部分
printf("\n");
str2_num = strtoul(str2, &end, 10);//将字符串里的十进制数字返回给num
printf("str2 转换的数字字符: %lu\n", str2_num);
printf("str2 剩余字符 : %s\n", end);//整个字符串的剩余部分
printf("\n");
str3_num = strtoul(str3, &end, 10);//将字符串里的十进制数字返回给num
printf("str3 转换的数字字符: %lu\n", str3_num);
printf("str3 剩余字符 : %s\n", end);//整个字符串的剩余部分
printf("\n");
str4_num = strtoul(str4, &end, 2);//2进制 进制表示的是字符串里的数字是什么进制
printf("str4 转换的数字字符: %lu\n", str4_num);
printf("\n");
str5_num = strtoul(str5, &end, 8);//8进制 进制表示的是字符串里的数字是什么进制
printf("str5 转换的数字字符: %lu\n", str5_num);
return 0;
}
运行结果:
str1 转换的数字字符: 12345
str1 剩余字符 : abc789
str2 转换的数字字符: 0
str2 剩余字符 : abc789
str3 转换的数字字符: 0
str3 剩余字符 : +-123456abc789
str4 转换的数字字符: 9
str5 转换的数字字符: 342391