HOWTO · C
在C中将整数转换为字符
了解在 C 中何时应加上 '0'、何时应将整数值赋给 char,以及何时应将字符格式化为字符串。
本页内容
在 C 中,请根据所需的结果选择转换方式:将 '0' 加到单个十进制数位上以得到其数字字符、将整数的字符值赋给 char,或使用 snprintf() 将一个字符放入字符串中。这些是不同的操作。若要把 71 这样的多位数整数变成文本 "71",请用 %d 将其格式化为十进制文本;转换为单个 char 无法容纳这两个数位。
使用 '0' 将单个十进制数位转换为字符
对于 0 到 9 的值,将其加到字符字面量 '0' 上。C 保证十进制数字字符的值是连续的,因此这种做法无需假设 ASCII 即可成立。请将输入保持在此范围内:这种运算只适用于单个数字,并非用来把整个整数转换为其十进制字符串。
以下完整程序将值 7 转换为其数字字符并输出:
#include <stdio.h>
int main(void) {
int digit = 7;
char digit_char = (char)('0' + digit);
printf("Digit: %c\n", digit_char);
return 0;
}
Digit: 7
对于需要显示多位数字的字符串,请使用 %d 这样的十进制格式化,而不是把 '0' 加到整个数字上。
将整数值转换为 char
char 存储的是字符值,而在 C 中字符值同时也是整数值。int 类型通常用于在赋给 char 之前的整数值。赋值会把右侧的值转换为目标类型;显式强制转换让这种转换变得可见,但不会检查该值是否合适。为了让示例具有可移植性,请从字符字面量推导整数,而不是假设像 65 这样的数值在每个系统上都代表 A。以下程序展示了这两种形式:
#include <stdio.h>
int main(void) {
int code = 'A';
char letter = code;
char cast_letter = (char)code;
printf("Assigned: %c; cast: %c\n", letter, cast_letter);
return 0;
}
Assigned: A; cast: A
当整数可以用 char 表示时,其值会被保留。普通的 char 可能是有符号的,也可能是无符号的。将超出范围的值转换为有符号 char 的结果由实现定义,或可能引发由实现定义的信号。转换为 unsigned char 遵循无符号整数的转换规则:结果按 UCHAR_MAX + 1 取模缩减。显式强制转换不会校验输入,也不会让超出范围的转换变得可移植。若需要解释字节值,请使用 unsigned char 并定义你的数据所使用的编码。
使用 snprintf() 将字符格式化为字符串
当结果必须是以 null 结尾的字符串而非单个 char 时,使用 snprintf()。它的 %c 转换会写入一个字符;目标位置还需要为结尾的 null 字符留出空间。大小参数是目标数组的总容量。相比之下,%d 会把整数格式化为十进制文本。
以下示例将字符 A 格式化到一个 2 字节的数组中,然后输出该字符串:
#include <stdio.h>
int main(void) {
char text[2];
int written = snprintf(text, sizeof text, "%c", 'A');
if (written < 0 || (size_t)written >= sizeof text) {
return 1;
}
printf("Text: %s\n", text);
return 0;
}
Text: A
snprintf() 返回它本应写入的字符数,不含 null 终止符。检查这个值可让调用者检测格式化失败,或结果放不下的情况。此示例使用 C99 标准库函数;请在 C99 或更新的环境中编译。
选择正确的转换方式
- 对于 0 到 9 的单个十进制数字,加上
'0'以形成对应的数字字符。 - 若要把字符值存入
char,请赋一个合适的整数值;显式强制转换不会改变任何范围规则。 - 若要把一个字符存为字符串,请使用带
%c的snprintf(),并为字符及其终止符都预留容量。 - 若要把多位整数表示为文本,请使用
%d这样的十进制格式化,写入字符数组。