【问题标题】:convert int to char without using ASCII [closed]在不使用 ASCII 的情况下将 int 转换为 char [关闭]
【发布时间】:2013-06-26 13:01:10
【问题描述】:

例如,我如何将低于 10 的 int 转换为 char:
5 -> '5'
(在不使用 ASCII 表的情况下将 int 转换为 char)

【问题讨论】:

  • 不使用ASCII表是什么意思?

标签: c++ c


【解决方案1】:

由于数字在标准字符集中总是连续的,你可以这样写:

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之后的每个字符的值都应比前一个字符的值大一。

【讨论】:

  • +1 这是将整数转换为 ascii 的惯用方式。'0' 是 0 的 ASCII 偏移量,因此将其添加到数字可以有效地将其转换为 ASCII
  • @MortenJensen s/number/digit/,以尽量减少混淆的风险。
  • @MortenJensen 推荐“将整数十进制数字转换为字符的惯用方法”。如果输入了源代码字符集,比如 EBCDIC,这仍然有效。 '0' 是符合 C 的 any 字符集的偏移量,而不仅仅是 ASCII。因此添加'0' 不一定将0 转换为ASCII,而是转换为源/执行的字符集。 ASCII 肯定很常见 - 自从我使用非 ASCII、非 Unicode 源代码以来已经有很多个月了。
【解决方案2】:

如果是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 正在尝试实现一个通用的二进制到十进制转换器,在这种情况下告诉他们使用现成的转换器并不是特别有用。
【解决方案3】:

这里有一个选项

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
  • @R.MartinhoFernandes 代码不足:P
  • 这不是一种真正有效的方法吗?即使它低于10?特别是当你有一个 itoa();?
  • @SD1990 第二个可能是,我怀疑第一个是。分析它并查看。
  • @SD1990 难以置信但使用switch 转换速度非常快。
【解决方案4】:

我不确定我是否理解您所说的“不使用 ASCII 表”是什么意思,但是

int i = 5;
char c = i + '0';

会做你想做的事。 '0' 到 '9' 的字符代码保证连续且顺序正确。

【讨论】:

    猜你喜欢
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2015-04-20
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多