你能解释一下输出并指出错误吗

Posted

技术标签:

【中文标题】你能解释一下输出并指出错误吗【英文标题】:Can you please Explain the output and point out mistake 【发布时间】:2011-03-14 08:25:54 【问题描述】:
char FramebufferUpdateRequest[11];
uint16_t val;
memset(FramebufferUpdateRequest, 0, 10);
FramebufferUpdateRequest[0] = 3;
FramebufferUpdateRequest[1] = 1;
val = 3;
memcpy(FramebufferUpdateRequest+6, &val, 2);
val = 2;
memcpy(FramebufferUpdateRequest+8, &val, 2);
FramebufferUpdateRequest[10]='\0';
printf("framerequest :: %c  %s\n", FramebufferUpdateRequest[1], FramebufferUpdateRequest);

此 printf 的输出为空白,即“framerequest ::”。谁能指出我做错了什么?

在 gcc 4.1.2 中编译

【问题讨论】:

你期望输出是什么?您正在尝试打印非打印字符。 【参考方案1】:

我想你想写:

memset(FramebufferUpdateRequest, 0, 10);
FramebufferUpdateRequest[0] = '3'; //notice the difference
FramebufferUpdateRequest[1] = '1'; //notice the difference
val = '3';  //or var = ('3' << 1 | '3') if you want both bytes to have '3'
memcpy(FramebufferUpdateRequest+6, &val, 2);
val = '2';  //or var = ('2' << 1 | '2') if you want both bytes to have '2'

了解'1'1的区别:

   cout << (int) ('1') << endl;
   cout << (int) (1) << endl;

输出:(http://www.ideone.com/z3spn)

49
1

解释:'1'是一个character literal,其ascii值为49,而1是一个整数。

【讨论】:

谢谢,但要说 val = '3'; memcpy(FramebufferUpdateRequest+6, &val, 2); --> char 只有 8 位,val 是 16 位。这个 memcpy 将如何工作。另外,如果我从标准输入中输入 val 则... @honeybadger:问得好。我很感激。由于 var 是 2 字节,所以它只有一个字节将包含 '3',而另一个字节将是 0。如果你想让两个字节都'3',那么你可以这样做:var = ('3' &lt;&lt; 1 | '3'); 所以如果说我从标准输入获取输入 val,然后执行:char value = val;和 memcpy(FramebufferUpdateRequest+6, &value, 2);很好,因为 memcpy 会将 0 放在其他 8 位中。对吗? @honeybadger:如果您希望两个字节具有相同的值,那么您应该使用memset 而不是memcpy。这就是你应该如何使用它:char input; cin &gt;&gt; input; memset(FramebufferUpdateRequest+6, input, 2);。 .......见memset .【参考方案2】:

您正在将不可打印的字符分配给FramebufferUpdateRequest

您需要以某种方式将其转换为整数(即​​使用循环和%d)或可打印字符(例如,将'A' 添加到每个元素)。

基本的可打印字符集显示为at Wikipedia。

【讨论】:

以上是关于你能解释一下输出并指出错误吗的主要内容,如果未能解决你的问题,请参考以下文章

.NextResult() 方法确实给出了一个错误,指出不存在数据

你能解释一下 lambda 表达式吗? [复制]

PostgreSQL 解释到底告诉我啥?

将堆栈传递给函数

你能解释一下为啥 DirectoryInfo.GetFiles 会产生这个 IOException 吗?

你能解释一下STA和MTA吗?