1、strtol() 函数原型
strtol()
在 头文件中定义。
long strtol(const char *nptr, char **endptr, int base);
1)参数
参数 | 描述 |
---|---|
nptr | 输入的 C 字符串。 |
endptr | 如果 endptr 不为 NULL ,strtol() 会存储第一个无效字符的指针到 *endptr 。 |
base | 转换的进制,支持 2 到 36 之间的进制。如果 base 设为 0 ,strtol() 会自动检测:1) 0x 或 0X 开头 → 16 进制2) 0 开头 → 8 进制3) 其他 → 10 进制 |
2)返回值
成功时返回转换后的 long
整数。如果无法转换,返回 0
,并且 endptr
指向 nptr
。如果溢出,返回 LONG_MAX
或 LONG_MIN
,并设置 errno
为 ERANGE
。
2、strtol() 的使用
1)转换字符串为整数
#include <stdio.h> #include <stdlib.h> int main() { char str[] = "12345"; char *endptr; long num = strtol(str, &endptr, 10); printf("转换后的数值: %ld\n", num); printf("未转换部分: %s\n", endptr); return 0; }
2)处理无效输入
如果 strtol()
遇到无效的数字,它不会触发错误,而是返回 0
,并让 endptr
指向第一个无法解析的字符。
#include <stdio.h> #include <stdlib.h> int main() { char str[] = "abc123"; char *endptr; long num = strtol(str, &endptr, 10); if (endptr == str) { printf("错误: 不能转换 '%s' 为数字\n", str); } else { printf("转换后的数值: %ld\n", num); printf("未转换部分: %s\n", endptr); } return 0; }
3)处理部分有效输入
#include <stdio.h> #include <stdlib.h> int main() { char str[] = "42xyz"; char *endptr; long num = strtol(str, &endptr, 10); printf("转换后的数值: %ld\n", num); printf("未转换部分: %s\n", endptr); return 0; }
4)处理溢出
如果解析的值超出了 long
的范围,strtol()
会返回 LONG_MAX
或 LONG_MIN
,并设置 errno = ERANGE
。
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <limits.h> int main() { char str[] = "999999999999999999999"; char *endptr; errno = 0; // 重置 errno long num = strtol(str, &endptr, 10); if (errno == ERANGE) { printf("错误: 数值超出范围\n"); } else { printf("转换后的数值: %ld\n", num); } return 0; }
5)strtol() 处理不同进制
strtol()
可以解析 二进制、八进制、十六进制 等。
#include <stdio.h> #include <stdlib.h> int main() { char hex[] = "0x1A"; char bin[] = "1010"; char oct[] = "075"; printf("十六进制: %ld\n", strtol(hex, NULL, 0)); // 自动检测 printf("二进制 (手动指定): %ld\n", strtol(bin, NULL, 2)); printf("八进制: %ld\n", strtol(oct, NULL, 0)); return 0; }
3、strtol() 和 atoi()
strtol()
和 atoi()
都是 C 语言用于将字符串转换为整数的函数,但它们在功能和使用上有较大的不同。优先使用 strtol()
,因为它支持更多功能,并提供错误检测,适用于健壮性要求更高的程序。atoi()
适用于简单的情况,如确定字符串一定是有效整数,并且不需要错误检测。
1)strtol()
#include <stdio.h> #include <stdlib.h> #include <errno.h> int main() { const char *str = "123abc"; char *endptr; long num = strtol(str, &endptr, 10); if (errno == ERANGE) { printf("Overflow or underflow occurred!\n"); } else if (endptr == str) { printf("No digits found!\n"); } else { printf("Converted number: %ld\n", num); printf("Remaining string: %s\n", endptr); } return 0; }
2)atoi()
#include <stdio.h> #include <stdlib.h> int main() { const char *str = "123abc"; int num = atoi(str); printf("Converted number: %d\n", num); return 0; }