strtol
是 C 标准库中的一个重要函数,用于将字符串转换为长整数。下面解释这个函数:
函数原型
long int strtol(const char* str, char** endptr, int base);
参数说明
1. str
- 要转换的字符串
-
指向【以 null 结尾的字符串】的指针(非常重要:请确保输入字符串以 null 结尾)
-
函数会跳过前面的空白字符
2. endptr
- 结束指针(可选)
(主要的作用:用于输入错误检测)
-
如果非 NULL,函数会将第一个无效字符的地址存储在这里
-
如果为 NULL,则忽略此信息
3. base
- 进制基数
-
2-36:指定转换的进制
-
0:自动检测进制(根据字符串前缀)
-
0x
或0X
:十六进制 -
0
:八进制 -
其他:十进制
-
返回值
-
成功:转换后的长整数值
-
失败:0 或 LONG_MAX/LONG_MIN(溢出时)
-
设置
errno
来指示错误类型
使用示例
1. 基本转换
#include <stdlib.h>
#include <stdio.h>int main() {const char* str1 = "12345";const char* str2 = "0x1A3F";const char* str3 = "1010";//指定字符串和进制,进行数字的转换long num1 = strtol(str1, NULL, 10); // 十进制: 12345long num2 = strtol(str2, NULL, 0); // 自动检测: 6719long num3 = strtol(str3, NULL, 2); // 二进制: 10//打印结果以十进制显示printf("num1 = %ld\n", num1);//结果:12345printf("num2 = %ld\n", num2);//结果:6719printf("num3 = %ld\n", num3);//结果:10return 0;
}
2. 使用 endptr 检测转换结果下载
#include <stdlib.h>
#include <stdio.h>int main() {const char* str = "123abc";char* endptr;long num = strtol(str, &endptr, 10);printf("转换的数字: %ld\n", num); // 123printf("剩余字符串: \"%s\"\n", endptr); // "abc"printf("转换的字符数: %td\n", endptr - str); // 3return 0;
}
3. 错误处理
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <limits.h>int main() {const char* str1 = "99999999999999999999"; // 超出 long 范围const char* str2 = "invalid";char* endptr;errno = 0; // 重置错误标志long num1 = strtol(str1, &endptr, 10);if (errno == ERANGE) {printf("数值超出范围\n");if (num1 == LONG_MAX)printf("上溢发生\n");else if (num1 == LONG_MIN)printf("下溢发生\n");}errno = 0;long num2 = strtol(str2, &endptr, 10);if (endptr == str2) {printf("没有数字被转换\n");}return 0;
}
在原代码中的应用
outputArray[outputSize++] = strtol(byteStr, nullptr, 16);
这里的使用:
-
byteStr
:包含两个十六进制字符的字符串(如 "1A") -
nullptr
:不关心结束位置 -
16
:明确指定十六进制转换
转换过程:
-
"1A"
→1*16 + 10 = 26
→0x1A
-
"FF"
→15*16 + 15 = 255
→0xFF
-
"00"
→0*16 + 0 = 0
→0x00
相关函数家族
函数 | 返回类型 | 说明 |
---|---|---|
strtol |
long |
转换到长整数 |
strtoll |
long long |
转换到长长整数 |
strtoul |
unsigned long |
转换到无符号长整数 |
strtod |
double |
转换到双精度浮点数 |
atoi |
int |
简单转换(不检查错误) |
重要注意事项
-
错误处理:总是检查
errno
和endptr
-
边界检查:确保输入字符串以 null 结尾
-
进制选择:使用 0 让函数自动检测通常更安全
-
性能:比
atoi
慢但更安全,支持错误检测
strtol
是一个强大而灵活的函数,特别适合需要健壮错误处理的场景。