单个字符转数字(ASCII码转换)
如果字符是数字(如 '0' 到 '9'),可以通过减去 '0' 的ASCII码值得到对应的数字:

(图片来源网络,侵删)
char c = '5'; int num = c - '0'; // 结果为 5
原理:数字字符 '0' 到 '9' 的ASCII码是连续的(48~57),直接相减即可得到数值。
字符串转整数(atoi 函数)
将整个字符串(如 "123")转换为整数:
#include <stdlib.h>
#include <stdio.h>
int main() {
char str[] = "123";
int num = atoi(str); // 结果为 123
printf("%d\n", num);
return 0;
}
注意:
atoi遇到非数字字符会停止转换(如"123abc"→123)。- 无法处理错误情况(如非数字字符串会返回0)。
更安全的字符串转整数(strtol 函数)
strtol 提供更好的错误处理和进制支持:

(图片来源网络,侵删)
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main() {
char str[] = "456";
char *endptr;
long num = strtol(str, &endptr, 10); // 10进制转换
if (errno == ERANGE) {
printf("数值超出范围!\n");
} else if (*endptr != '\0') {
printf("包含非数字字符!\n");
} else {
printf("%ld\n", num); // 输出 456
}
return 0;
}
参数说明:
str:待转换的字符串。endptr:指向第一个未转换字符的指针(可用于检查非法字符)。10:表示10进制(可改为16表示16进制等)。
手动实现字符串转数字
如果需要自定义逻辑(如处理前导空格、符号等):
#include <stdio.h>
#include <ctype.h> // 用于 isdigit()
int stringToNumber(const char *str) {
int num = 0;
int sign = 1; // 默认正数
int i = 0;
// 处理符号
if (str[i] == '-') {
sign = -1;
i++;
} else if (str[i] == '+') {
i++;
}
// 逐个字符转换
while (str[i] != '\0' && isdigit(str[i])) {
num = num * 10 + (str[i] - '0');
i++;
}
return sign * num;
}
int main() {
char str[] = "-789";
printf("%d\n", stringToNumber(str)); // 输出 -789
return 0;
}
十六进制字符转数字
处理 'A' 到 'F' 或 'a' 到 'f' 的十六进制字符:
char c = 'A';
int num;
if (c >= '0' && c <= '9') {
num = c - '0';
} else if (c >= 'A' && c <= 'F') {
num = 10 + (c - 'A');
} else if (c >= 'a' && c <= 'f') {
num = 10 + (c - 'a');
}
// 结果为 10
| 场景 | 方法 | 适用情况 |
|---|---|---|
| 单个数字字符转数字 | c - '0' |
仅限 '0'~'9' |
| 字符串转整数 | atoi() |
简单场景,无错误处理 |
| 安全字符串转整数 | strtol() |
需错误检查或进制支持 |
| 自定义转换逻辑 | 手动实现 | 需特殊规则(如符号、前导空格) |
| 十六进制字符转数字 | 条件判断 | 处理 'A'~'F' 或 'a'~'f' |
根据需求选择合适的方法,注意边界条件和错误处理!

(图片来源网络,侵删)
