【问题标题】:Store an integer in char array in C在C中将整数存储在char数组中
【发布时间】:2019-04-02 23:40:20
【问题描述】:

运行下面的代码会打印出b = and i = 15

int i = 15;
char b = (char) i;
printf("b = %c and i = %d\n", b, i);

如何将这个整数存储在字符中?最后,我尝试创建一个大小为 1024 的 char 数组,其中 i (15) 作为第一个字符,其余为 0。

更新:我试过了:

int i = 15;
char buffer[1024];
snprintf(buffer, 10, "%d", i);
printf("buffer[0] = %c, buffer[1] = %c\n", buffer[0], buffer[1]);

打印出来的结果是:

缓冲区[0] = 1,缓冲区[1] = 5

【问题讨论】:

  • 您说i=15 并且如果我没有记错但15 不是字符,那么您希望b 也等于15。您不能在单个字符变量 (b) 中保存 2 个字符(1 和 5)。不过,我可能误解了您的问题。
  • 您需要访问 http://www.asciitable.com/ 并熟悉可打印字符的 ASCII 值。

标签: c arrays char


【解决方案1】:

您确实将整数存储在字符中,只是%c 将字符转换为其 ASCII 值。所有低于 31 的 ASCII 值都是不可打印的。

如果你运行

printf("b = %d and i = %d\n", (int)b, i);

它将打印 15。

如果您想要将i 表示为字符串:

char buf[12]; //Maximum number of digits in i, plus one for the terminating null
snprintf(buf, 12, "%d", i);

这会将i 的字符串表示形式存储在buf 中。

【讨论】:

  • 我试过了:char buffer[1024]; snprintf(缓冲区, 1, "%d", i); printf("缓冲区[0] = %c, 缓冲区[1] = %c\n", 缓冲区[0], 缓冲区[1]);但我仍然没有得到缓冲区的 1 和 5 (i=15)
  • 不应该是snprintf(buf, 10, "%d", i);吗?
  • @Dmitri 哎呀。谢谢你的收获。
  • @NickyMirfallah 正如 Dimitri 提到的,我有一个小错字。 char buffer[1024]; snprintf(buffer, 1024, "%d", i); printf("buffer[0] = %c, buffer[1] = %c\n", buffer[0], buffer[1]); 应该可以工作。请注意printf("%s\n", buffer); 将打印出整个字符串(本例中为“15”)。
  • 嗯,典型的int可以存储-2,147,483,648的值。对于可能需要大小为 12 的字符串,幻数 10 是不够的。
【解决方案2】:

一个 char 是一个 8 位无符号值 (0 - 255),它确实在其中存储了 15,问题是,在 ASCII 表中,15 表示“移入”不可打印字符,而 %c 解释作为 ascii 字符的值。

char b = (char) i;
printf("b = %d and i = %d\n", b, i);

得到

b = 15 和 i = 15

如果您在当前代码中使用了i = 90,则会打印出来:

b = Z 和 i = 90

【讨论】:

  • char 并不总是未签名的。
【解决方案3】:

这里的问题是,变量b 已经有一个值15,但由于这不构成可打印的ASCII,使用%c 格式说明符,您将无法看到任何输出.

要打印值,请使用%hhd 格式说明符。

最后,我尝试创建一个大小为 1024 的 char 数组,其中 i (15) 作为第一个字符,其余为 0。

好吧,您可以定义一个数组并相应地分配值。类似的东西

#define SIZE 1024

char arr [SIZE] = {0}; //initialization, fill all with 0
arr[0] = 15;           //first value is 15

应该做的工作。

【讨论】:

  • %hhd 在打印前将整数参数转换为 signed charchar 可能不是 signed char。 IAC,printf("b = %dn", b); 就足够了,除非罕见的 charunsigned 的宽度/符号相同。
【解决方案4】:

澄清:

char 的范围是 -128..127。 unsigned char 的范围是 0..255。

如果目标是捕获 ASCII 值,则将缓冲区变量声明为 unsigned char 类型似乎更合适。

【讨论】:

  • ASCII 的值在 0 到 127 的范围内,可以保存在 charunsigned chartsigned char 中。
  • 是的。但是任何大于 127 的 ASCII 值都需要 unsigned char 类型。
  • 由于 ASCII 被定义在 0 到 127 的范围内,“大于 127 的 ASCII 值”是错误的前提。也许你对 ASCII 是各种extensions 的东西?
  • 是的。我正在考虑 ASCII 扩展。
【解决方案5】:

您不能将整数数据类型存储在字符数据类型中(数据类型冲突)。 但是你想要的,可以通过二维字符数组来实现。

char b[1024][1024];
itoa(i,b[0],20); /// 
for(int i = 1 ; i < 1024 ; i++)
    itoa(0,b[i],20);

函数itoa将整数转换为字符数组并存入字符数组。希望能帮助到你。

click here for more info :)

【讨论】:

  • char b = (char) i; 很好。 C 规范不支持“您不能在字符数据类型中存储整数数据类型”。 char 是整数类型。
猜你喜欢
  • 2019-06-12
  • 2012-10-12
  • 1970-01-01
  • 2010-12-28
  • 2016-04-28
  • 2013-11-03
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多