【问题标题】:Merge ascii char using C [duplicate]使用C合并ascii char [重复]
【发布时间】:2020-07-08 21:49:53
【问题描述】:

我尝试了以下代码,但无法获得所需的输出。 结果应该是AB,它应该来自单个变量C


int main() 
{
  int a = 'A';
  int b = 'B';
  unsigned  int C = a << 8 | b;
  printf(" %c\n",C);
  return 0;
}```

【问题讨论】:

  • 请不要发布代码图片 - reasoning。请将其发布为格式化文本。
  • %c 只会读取一个字符/字节。你真的需要/想要为此使用位移吗? int C = 'AB' 不是有效代码。因此,目前尚不清楚期望的结果是什么。
  • 注意:01000001 是 0x41 不是 0x1000 和 01000010 是 0x42 不是 0x2000
  • 关于:int a = 'A'; int b = 'B'; 这些应该声明为 unsigned 而不是 int
  • 同一个问题不要问两次!

标签: c char decimal ascii bit


【解决方案1】:

%c 将打印一个字符。如果要打印字符串,则必须使用%s 并提供指向该字符串的指针。 C 中的字符串必须以 null 结尾,这意味着它们需要在文本之后增加一个字符,并且该字符带有值 \0(零)。

您可以在int 中执行此操作,但您必须先了解一些概念。

如果您使用的是 Intel 架构的计算机,大于一个字节的整数变量将在内存中以相反的顺序存储数据。这称为little-endianness

所以像0x11223344(十六进制)这样的数字将作为字节序列44 33 22 11存储在内存中。

'A'等价于数字65,即0x00000041,如果放入32位整数将存储为41 00 00 00

当您执行'A' &lt;&lt; 8 | 'B' 时,您创建了数字0x00006566,但在内存中它实际上是66 65 00 00(相当于字符串"BA\0\0")。它与您尝试执行的顺序相反,但由于它在技术上以 null 结尾,因此它是一个有效的字符串。

您可以使用sprintf("%s", &amp;C); 打印此内容

如果您使用的是大端架构(例如 ARM),则必须计算空终止符,但我想我已经为您提供了足够的信息来弄清楚发生了什么。

【讨论】:

  • 使用 %s 给我分段错误。
  • 您可能提供的指针无效。您必须将 &amp;C 作为参数传递(指向 C 的指针),而不是 C 本身。
  • #include &lt;stdio.h&gt; int main() { int a = 'A'; int b = 'B'; unsigned char C = a &lt;&lt; 8 | b; printf(" %c",C); return 0; }
  • 再次使用sprintf("%s", &amp;C)
【解决方案2】:

您尝试仅打印位于 &C 的单个字节,因此取决于您的机器是否为小端序,您将得到“66”作为输出,或者如果您的机器为大端序,您将得到 0作为输出。

【讨论】:

  • 您的回答没有解决这部分问题:“结果应该是 AB,它应该来自单个变量 C”
  • 我想要AB 在输出中。请告诉我所需的更改。
  • 获得 AB 作为输出的一种方法是使用类似 printf("%c%c", *((unsigned char *)&C)+1), C);
  • @raqeeb,输出应该从一个变量中取出,否则我会做类似printf("%c%c", a,b);
  • C = b
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2020-12-04
  • 2013-01-25
  • 1970-01-01
  • 2017-04-02
相关资源
最近更新 更多