Cout 不打印号码

Posted

技术标签:

【中文标题】Cout 不打印号码【英文标题】:Cout not printing number 【发布时间】:2011-12-25 07:54:06 【问题描述】:

问题

我没有从一个简单的 cout 得到任何输出,而 printf 总是会打印数字:

std::cout << variableuint8;  // prints nothing
printf("%u", variableuint8); // prints the number

我以前从未遇到过这种行为,虽然我有一个解决办法,但我想了解它。

上下文:

是的,指针。所以它可能比所说的要复杂一些。这是上下文-我认为这无关紧要,到 cout 和 printf 获取信息时,它已被取消引用为简单的无符号字符。这可能比解决问题所需的信息更多,但我希望它是相关的。

typedef unsigned char   UInt8;
typedef unsigned short  UInt16;

typedef struct
   UInt8   len;
   // some other definitions. sizeof(DeviceNotification) <= 8
DeviceNotification;

UInt8 somerandomdata[8];
DeviceNotification * notification;

notification = (DeviceNotification *) somerandomdata;

std::cout << "Len: (" << notification->len << ")\n";
printf("Len: (%u)\n", notification->len);

随机数据在别处初始化。对于这个输出,数组中的第一个字节是 0x08:

输出:

Len: ()
Len: (8)

环境

开发机: OS X 10.6.8 编译器 LLVM 1.7 Xcode 3.2.6 测试机: OS X 10.6.8

【问题讨论】:

我只想问下面这行是用C++定义的吗? ` notification = (DeviceNotification *) somerandomdata;` 如果对齐不是DeviceNotification 的必需对齐,此行不会调用未定义的行为吗? @AraK 这些在 x86 上运行,允许未对齐的内存访问。它们可能更慢,因为它们可能需要两次读取内存总线才能获得跨边界拆分的值,但它工作得很好。您可以进行一些实验来证明这一点 - 如果您这样做了,请告诉我们是否存在速度差异。 谢谢,这很有趣。能写出这样一个微基准就好了。 即使在有严格对齐要求的机器上,这些往往也适用于基本类型而不是结构。特别是,访问字节大小的成员(例如UInt8 len)是安全的。 【参考方案1】:

std::cout &lt;&lt; "Len: (" &lt;&lt; (unsigned short)notification-&gt;len &lt;&lt; ")\n"; 会打印正确的值吗?我猜想转换为整数可能是要找的。​​p>

【讨论】:

是的,这是正确的解决方法。就我而言,我投了(UInt16),但效果是一样的。【参考方案2】:

它将char 打印为一个字符。

#include <iostream>

int main() 
        unsigned char c = 0x41;
        std::cout << c << std::endl;
        return 0;

这会将“A”打印到标准输出。

虽然在这种情况下,您的代码应该打印Len: (*),而且我确实已经验证它打印Len: (*)


编辑:由于在您的控制台可能使用的字符编码(如 ASCII 或 UTF-8)中,对应于 8(Backspace)的字符是不可见的,它看起来好像没有打印出来。

(在某些情况下,它可能会导致前一个字符(()消失,因为它是一个退格字符。在 DOS 中它可能会显示 ◘)

【讨论】:

这就是问题所在。关于我的示例输出不正确,您是对的 - 我已经对其进行了更改以演示我实际遇到的问题。 这不是一个真正的观点。示例程序应该打印42 (*),但它没有。 @tyz 我在我的例子中犯了一个错误——肯尼是正确的。我已经用我正在处理的实际值修改了我的示例。很抱歉造成混乱。【参考方案3】:

您是否尝试将其转换为 int,以避免依赖于实现所使用的 char 类型:

std::cout << (int)variableuint8;

这里是对发生的事情的解释:What is an unsigned char?

为了了解一下,您的实现使用unsigned char 作为char。 0x08 的 ASCII 码是退格控制字符,当然它不是可打印字符,这就是为什么在 std::cout 的情况下看不到输出的原因。

【讨论】:

std::cout &lt;&lt; +variableuint8; 会更简单

以上是关于Cout 不打印号码的主要内容,如果未能解决你的问题,请参考以下文章

std::cout 不打印我想要的? [复制]

printf打印不出来?cout却可以

在释放模式 cout 不打印任何东西

在cin之前打印“cout”?

字符作为数字打印到 std::cout

无法使用 ostream 打印,但可以使用 cout 打印?