1. 理解strtol与strtoul的核心功能
这两个函数是C标准库中用于字符串到数值转换的经典工具,它们定义在<stdlib.h>头文件中。strtol(string to long)将字符串转换为长整型,而strtoul(string to unsigned long)则转换为无符号长整型。我在处理配置文件解析和网络协议数据时,这两个函数的使用频率相当高。
它们的函数原型如下:
c复制long strtol(const char *str, char **endptr, int base);
unsigned long strtoul(const char *str, char **endptr, int base);
参数解析:
- str:要转换的字符串起始地址
- endptr:用于存储转换结束位置的指针地址
- base:数值基数(2-36),特殊值0表示自动检测(0x开头为16进制,0开头为8进制,否则为10进制)
注意:当base为16时,字符串可以包含"0x"前缀;当base为8时,可以包含"0"前缀。但自动检测(base=0)时这些前缀才是必须的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 函数行为细节与边界处理
2.1 转换规则详解
转换过程从左到右扫描字符串,忽略前导空白字符(通过isspace()判断),然后尽可能多地转换符合当前进制(base)的有效字符。遇到第一个无效字符时停止转换,并将endptr指向该位置。
有效转换示例:
c复制char *end;
long val = strtol(" 42abc", &end, 10);
// val = 42, end指向"abc"
无效转换情况:
- 字符串为空或仅包含空白字符
- 第一个非空白字符不符合当前进制
- 转换结果超出对应类型的表示范围
2.2 错误检测与处理机制
这两个函数通过多种方式报告错误:
-
返回值:
- 对于strtol,如果结果溢出则返回LONG_MAX或LONG_MIN
- 对于strtoul,返回ULONG_MAX并设置errno为ERANGE
-
errno标志:
- ERANGE:结果超出范围
- EINVAL:无效的base参数(不在2-36范围内)
-
endptr参数:
