【发布时间】:2013-06-26 13:01:10
【问题描述】:
例如,我如何将低于 10 的 int 转换为 char:
5 -> '5'
(在不使用 ASCII 表的情况下将 int 转换为 char)
【问题讨论】:
-
不使用ASCII表是什么意思?
例如,我如何将低于 10 的 int 转换为 char:
5 -> '5'
(在不使用 ASCII 表的情况下将 int 转换为 char)
【问题讨论】:
由于数字在标准字符集中总是连续的,你可以这样写:
int number = 5;
int character = number + '0';
/* Here, character == '5' */
例如,参见 C11 标准。
n1570, § 5.2.1 字符集
十进制数字:
0 1 2 3 4 5 6 7 8 9[...]
在源基本字符集和执行基本字符集中,上述十进制数字列表中0之后的每个字符的值都应比前一个字符的值大一。
这同样适用于 C++。
n3337, § 2.3 字符集
在源基本字符集和执行基本字符集中,上述十进制数字列表中0之后的每个字符的值都应比前一个字符的值大一。
【讨论】:
'0' 是 0 的 ASCII 偏移量,因此将其添加到数字可以有效地将其转换为 ASCII
'0' 是符合 C 的 any 字符集的偏移量,而不仅仅是 ASCII。因此添加'0' 不一定将0 转换为ASCII,而是转换为源/执行的字符集。 ASCII 肯定很常见 - 自从我使用非 ASCII、非 Unicode 源代码以来已经有很多个月了。
如果是0-9号就很好用:
int i = 5;
char ch = i + '0';
但可能最好的选择是使用 itoa()
int i = 124;
char buffer[33];
itoa(i, buffer, 10); //10 mean decimal.
【讨论】:
itoa 是非标准的;最好推荐snprintf。但有可能 OP 正在尝试实现一个通用的二进制到十进制转换器,在这种情况下告诉他们使用现成的转换器并不是特别有用。
这里有一个选项
char c;
int x;
//...
switch ( x )
{
case 1:
c = '1';
break;
//and so on
}
还有一个:
std::map<int, char> mapping;
mapping[1] = '1';
//...
char c = mapping[4];
【讨论】:
char mapping[] = "0123456789";:P
switch 转换速度非常快。
我不确定我是否理解您所说的“不使用 ASCII 表”是什么意思,但是
int i = 5;
char c = i + '0';
会做你想做的事。 '0' 到 '9' 的字符代码保证连续且顺序正确。
【讨论】: