在C语言中,将字符串(char*或char[])转换为整数(int)主要有以下几种方法:

(图片来源网络,侵删)
方法1:使用 atoi() 函数(最简单)
atoi() 是C标准库函数,定义在 <stdlib.h> 中,用于将字符串转换为 int 类型。
#include <stdio.h>
#include <stdlib.h> // 包含 atoi 函数
int main() {
char str[] = "12345";
int num = atoi(str); // 直接转换
printf("转换后的整数: %d\n", num); // 输出: 12345
// 处理无效输入(非数字字符)
char invalid_str[] = "12a34";
int invalid_num = atoi(invalid_str); // 遇到非数字字符时停止转换
printf("无效转换结果: %d\n", invalid_num); // 输出: 12
return 0;
}
特点:
- 简单直接,但无法检测转换错误(如输入
"abc"会返回0)。 - 遇到非数字字符会停止转换(如
"123abc"→123)。 - 空字符串或纯非数字字符串返回
0。
方法2:使用 strtol() 函数(更安全,推荐)
strtol()(string to long)是更强大的转换函数,可以检测错误并处理不同进制(如十进制、十六进制等),定义在 <stdlib.h> 中。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h> // 用于检测错误
int main() {
char str[] = "12345";
char *endptr; // 用于存储转换停止的位置
// 转换为长整型(long),后续可强制转为 int
long num = strtol(str, &endptr, 10); // 10 表示十进制
// 检查转换是否成功
if (endptr == str) {
printf("转换失败:输入不是有效的数字!\n");
} else if (*endptr != '\0') {
printf("部分转换成功,剩余字符: %s\n", endptr);
} else {
printf("转换后的整数: %ld\n", num);
}
// 处理溢出情况
errno = 0; // 重置错误标志
char overflow_str[] = "999999999999999999999";
long long_num = strtol(overflow_str, &endptr, 10);
if (errno == ERANGE) {
printf("错误:数值超出 long 范围!\n");
}
return 0;
}
特点:

(图片来源网络,侵删)
- 可以检测转换是否完全成功(通过
endptr)。 - 支持不同进制(如
strtol("FF", &endptr, 16)会将十六进制"FF"转为255)。 - 通过
errno检测溢出(ERANGE)。
方法3:手动实现(自定义逻辑)
如果需要更精细的控制(如处理前导空格、正负号等),可以手动实现转换逻辑。
#include <stdio.h>
#include <ctype.h> // 用于 isdigit 函数
int my_atoi(const char *str) {
int sign = 1; // 默认正数
int num = 0;
int i = 0;
// 跳过前导空格
while (str[i] == ' ') {
i++;
}
// 处理正负号
if (str[i] == '+' || str[i] == '-') {
sign = (str[i] == '-') ? -1 : 1;
i++;
}
// 逐个字符转换
while (isdigit(str[i])) {
num = num * 10 + (str[i] - '0');
i++;
}
return sign * num;
}
int main() {
char str[] = " -12345";
int num = my_atoi(str);
printf("转换后的整数: %d\n", num); // 输出: -12345
return 0;
}
特点:
- 完全可控,适合特殊需求(如自定义错误处理)。
- 需要自行处理边界情况(如溢出)。
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
atoi() |
简单快速 | 无法检测错误,不安全 | 简单场景,输入可信时 |
strtol() |
安全,支持错误检测和进制转换 | 稍复杂 | 生产环境,推荐使用 |
| 手动实现 | 完全可控 | 需要自行处理所有边界情况 | 特殊需求(如自定义格式) |
推荐优先使用 strtol(),它在安全性和功能性之间取得了平衡。

(图片来源网络,侵删)
