- 将
char字符转换为其对应的ASCII码整数值(将'A'转换为65)。 - 将
char字符串(或C风格字符串)转换为一个真正的整数(将字符串"123"转换为整数123)。
下面我将详细解释这两种情况,并提供代码示例。

(图片来源网络,侵删)
将 char 字符转换为ASCII码值
这是最简单直接的情况,在C语言中,char 类型本质上是一个小整型,它存储的是字符在ASCII(或更广泛的字符编码,如Unicode)表中的整数值。
方法:直接赋值
你可以直接将 char 变量赋值给一个 int 变量,C语言会自动进行整型提升,将 char 的值扩展为 int 类型。
代码示例:
#include <stdio.h>
int main() {
char ch1 = 'A';
char ch2 = 'a';
char ch3 = '5';
char ch4 = '\n'; // 换行符
// 直接将 char 赋值给 int
int int1 = ch1;
int int2 = ch2;
int int3 = ch3;
int int4 = ch4;
printf("字符 '%c' 的ASCII码是: %d\n", ch1, int1); // 输出: 字符 'A' 的ASCII码是: 65
printf("字符 '%c' 的ASCII码是: %d\n", ch2, int2); // 输出: 字符 'a' 的ASCII码是: 97
printf("字符 '%c' 的ASCII码是: %d\n", ch3, int3); // 输出: 字符 '5' 的ASCII码是: 53
printf("字符 '\\n' 的ASCII码是: %d\n", ch4, int4); // 输出: 字符 '\n' 的ASCII码是: 10
return 0;
}
关键点:

(图片来源网络,侵删)
- 这种转换是隐式的,不需要任何特殊的函数。
char可以是signed char(范围通常是 -128 到 127)或unsigned char(范围通常是 0 到 255),当它被提升为int时,如果原始char是signed且为负数,高位会进行符号扩展,但对于标准的ASCII字符(0-127),这两种char的行为是一样的。
将 char 字符串转换为整数值
这种情况更复杂,也更有用,你从文件或用户输入中读到了一个字符串 "123",你需要把它变成数字 123 才能进行数学计算。
方法1:使用标准库函数 atoi() (最简单)
atoi() 函数(ASCII to Integer)是C标准库 <stdlib.h> 中提供的函数,专门用于将字符串转换为 int 类型。
特点:
- 非常简单,一行代码搞定。
- 如果字符串开头不是数字,或者为空,
atoi()会返回0。 - 缺点:它无法检测转换错误,如果字符串是
"123abc",atoi()会成功返回123,这可能是你想要的,也可能不是,如果字符串是"abc",它也会返回0,但你无法区分这是转换失败还是字符串真的就是"0"。
代码示例:

(图片来源网络,侵删)
#include <stdio.h>
#include <stdlib.h> // 必须包含此头文件
int main() {
char str1[] = "12345";
char str2[] = "-678";
char str3[] = "42 is the answer"; // atoi会忽略数字后面的非数字字符
char str4[] = "hello"; // 转换失败,返回0
char str5[] = "9876543210"; // 超出int范围,行为未定义(通常返回INT_MAX或INT_MIN)
int num1 = atoi(str1);
int num2 = atoi(str2);
int num3 = atoi(str3);
int num4 = atoi(str4);
printf("字符串 \"%s\" 转换为整数: %d\n", str1, num1); // 输出: 字符串 "12345" 转换为整数: 12345
printf("字符串 \"%s\" 转换为整数: %d\n", str2, num2); // 输出: 字符串 "-678" 转换为整数: -678
printf("字符串 \"%s\" 转换为整数: %d\n", str3, num3); // 输出: 字符串 "42 is the answer" 转换为整数: 42
printf("字符串 \"%s\" 转换为整数: %d\n", str4, num4); // 输出: 字符串 "hello" 转换为整数: 0
return 0;
}
方法2:使用更安全的 strtol() (推荐)
strtol() 函数(string to long)是 atoi() 的一个更强大、更安全的替代品,它可以进行错误检测,并且可以转换更大的 long 类型整数。
特点:
- 可以检测转换是否完全成功。
- 可以处理超出
int范围的数字(返回long类型)。 - 可以告诉你字符串中第一个非数字字符的位置。
代码示例:
#include <stdio.h>
#include <stdlib.h> // 包含 strtol
#include <errno.h> // 包含 errno,用于错误检测
#include <limits.h> // 包含 LONG_MAX, LONG_MIN
int main() {
char str1[] = "12345";
char str2[] = "-678";
char str3[] = "42 is the answer";
char str4[] = "hello";
char str5[] = "9876543210"; // 可能超出 int 范围
char *endptr; // 用于存储转换停止的位置
// 重置 errno,这是使用 strtol 的标准做法
errno = 0;
long l1 = strtol(str1, &endptr, 10);
if (errno == ERANGE || l1 > INT_MAX || l1 < INT_MIN) {
printf("错误: 数字 \"%s\" 超出 int 范围,\n", str1);
} else if (endptr == str1) {
printf("错误: 字符串 \"%s\" 不是有效的数字,\n", str1);
} else {
printf("字符串 \"%s\" 转换为整数: %d\n", str1, (int)l1);
}
// 对 str2 进行转换
errno = 0;
long l2 = strtol(str2, &endptr, 10);
if (errno == ERANGE || l2 > INT_MAX || l2 < INT_MIN) {
printf("错误: 数字 \"%s\" 超出 int 范围,\n", str2);
} else if (endptr == str2) {
printf("错误: 字符串 \"%s\" 不是有效的数字,\n", str2);
} else {
printf("字符串 \"%s\" 转换为整数: %d\n", str2, (int)l2);
}
// 对 str3 进行转换
errno = 0;
long l3 = strtol(str3, &endptr, 10);
if (endptr != str3) { // 只要转换了部分内容,endptr就不会指向开头
printf("字符串 \"%s\" 转换为整数: %d (停止于 '%c')\n", str3, (int)l3, *endptr);
}
// 对 str4 进行转换
errno = 0;
long l4 = strtol(str4, &endptr, 10);
if (endptr == str4) { // endptr 仍然指向开头,说明没有转换任何数字
printf("错误: 字符串 \"%s\" 不是有效的数字,\n", str4);
}
return 0;
}
strtol 详解:
long strtol(const char *nptr, char **endptr, int base);nptr: 要转换的字符串。endptr: 一个char**指针,转换结束后,它会指向字符串中第一个无效字符的位置,如果整个字符串都被成功转换,它会指向字符串的结束符'\0',如果转换失败(即没有数字被转换),它会指向nptr的开头。base: 转换的基数(进制)。10代表十进制,16代表十六进制,8代表八进制,如果为0,函数会根据字符串的前缀自动判断(如0x为十六进制,0为八进制)。
总结与最佳实践
| 场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
| 单个字符转ASCII码 | 直接赋值 (int i = ch;) |
简单、快速、高效 | 不适用于字符串转换 |
| 字符串转整数 | atoi() |
极其简单 | 不安全,无法检测错误,不推荐用于新代码 |
| 字符串转整数(需安全) | strtol() |
安全、强大,可检测错误和范围,可处理 long |
代码稍复杂,需要处理 errno 和 endptr |
- 如果你只是想知道一个字符(如
'A')的ASCII码,直接赋值即可。 - 如果你需要将一串字符(如
"123")转换为一个数字,强烈推荐使用strtol(),因为它提供了必要的错误检查,让你的程序更加健壮和可靠。atoi()虽然简单,但在现代编程中因其不安全性而很少被推荐使用。
