【问题标题】:Converting an int to a char in C?在C中将int转换为char?
【发布时间】:2014-02-07 10:25:30
【问题描述】:

我正在尝试将 int 添加到 char 数组中。我的(坏掉的)代码如下,

string[i] = (char) number;

i 是数组的某个 int 索引,number 是某个整数。实际上,在输入此内容时,我注意到如果数字超过一位,则会出现另一个问题,因此,如果您对该问题也有一些答案,那就太好了!

【问题讨论】:

  • 您希望进入string[i] 的内容是什么?假设number 包含 8;你对string[i] 有什么期待?如果number 包含 264 怎么办?
  • @JonathanLeffler,如果number 包含 8,我希望 '8' 在 string[i] 中。我实际上没有考虑多位数字的情况。我想我必须将number 限制为大于或等于 0 且小于或等于 9。
  • 你在评论中说'8',意思是ASCII字符8? ASCII 8 是整数值 56。你想要可打印的 ASCII 8 还是整数 8
  • 盯着this chart 并调试您的代码以查看number 的值可能会很多解释您所看到的行为。
  • 您是在尝试获取数字的视觉表示,还是尝试将值向下转换为更窄的字段并考虑溢出等问题?

标签: c arrays char int type-conversion


【解决方案1】:

你会想要使用 sprintf()。

sprintf(string,'%d',number);

我相信。

编辑:要回答您问题的第二部分,您将整数转换为一个字符,该字符实际上只包含一位数字。你想把它放在一个 char* 或一个字符数组中。

【讨论】:

    【解决方案2】:

    如果要将单个数字转换为数字字符,可以使用

    string[i] = (char) (number+'0');
    

    当然你应该检查int值是否在0到9之间。如果你有任意数字并且你想将它们转换为字符串,你应该使用snprintf,但是当然,你不能挤压它在一个 char aynmore 中,因为每个 char 代表一个数字。

    如果您通过手动创建数字表示,则不应忘记 C 字符串末尾需要一个 \0 字节。

    【讨论】:

      【解决方案3】:

      考虑到修改后的要求,如果number == 0,则将数字'0' 转换为string[i],并且对于19 之间的number 值类似,那么您需要将'0' 添加到数字:

      assert(number >= 0 && number <= 9);
      string[i] = number + '0';
      

      逆变换用于将数字字符转换回对应的数字:

      assert(isdigit(c));
      
      int value = c - '0';
      

      【讨论】:

      • 值得注意的是,这是因为 C 要求 '0' .. '9' 的表示是连续的。此方法不一定适用于不需要连续的字母;例如,'a' + 25 不一定是 'z'(尽管它是 ASCII 格式)。
      • @KeithThompson 为什么会这样?在我看来,当我执行 char letter = 'a'letter++; 时,它会不断增加 ASCII 值,因此 a + 25 将是 'z'
      • @Rohan:是的,'a' + 25 == 'z' -- 供您实施。我的观点是 C 标准不能保证这一点。特别是,对于使用 ECBDIC 而不是 ASCII 的系统来说,情况并非如此。 C确实保证'0' + 9 == '9'是连续的(但不是'0' == 48)。
      • 对于大多数系统,包括使用 Unicode 和 ISO 8859 代码集的系统,然后对于非重音拉丁字母,您可以 assert('z' - 'a' == 25);,但在 EBCDIC 中,主要在 IBM 大型机或系统中找到连接到这些,字母表中有空格(所以'a'..'i'是连续的(0x81..0x89),'j'..'r'是连续的(0x91..0x99),'s '..'z' 是连续的 (0xA2..0xA9))。在这些范围之间的间隙中存在有效的非字母字符。有关更多信息,请参阅维基百科上的 EBCDIC
      【解决方案4】:

      使用 asprintf :

      char *x;
      int size = asprintf(&x, "%d", number);
      free(x);
      

      更好,因为您不必分配内存。由 asprintf 完成

      【讨论】:

      • 除了是一个非标准的 GNU 扩展之外,这个想法是正确的。
      猜你喜欢
      • 2013-08-10
      • 2018-02-10
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 2015-01-29
      相关资源
      最近更新 更多