为什么char数组不打印值?

问题描述 投票:0回答:2

我需要从char数组读回'id'和'port'。但是cout不会打印任何内容。正确的方法是什么?

谢谢您的帮助。

int main() {
    char addr[6];
    int id = 2;
    short port = 1;
    memcpy(&addr[0], &id, sizeof(int));
    memcpy(&addr[4], &port, sizeof(short));

    cout << "addres:" << addr << endl;
    return 0;
}
c++ c++11
2个回答
1
投票

[因为假设目标平台上的int是32位,所以您要将4个字节(0, 0, 0, 22, 0, 0, 0,取决于字节序)复制到addr指向的地址中,并假设short是16位,则您正在0, 1指向的地址复制2个字节(1, 0addr+4,取决于字节序),从而导致addr包含字节0, 0, 0, 2, 0, 12, 0, 0, 0, 1, 0

C ++中的C样式字符串以0结尾,因此,如果第一个字符为0,则addr被解释为空字符串。

如果第一个字符为2,您仍然看不到任何内容,因为这不是可打印的字符。 (这是控制字符STX(文本开始)。)


0
投票

您可以打印addr的内容的整数值以了解其中的内容。

for (int i = 0; i < 6; ++i )
{
    std::cout << "element " << i << " : " << static_cast<int>(addr[i]) << std::endl;
}

您很可能会得到:

element 0 : 2
element 1 : 0
element 2 : 0
element 3 : 0
element 4 : 1
element 5 : 0

假定:

  1. sizeof(int)在您的平台上为4。
  2. sizeof(short)在您的平台上为2。
  3. 您的平台使用小端数字系统。

使用时

    cout << "addres:" << addr << endl;

[您正在打印在第一个元素中具有不可打印字符而在第二个元素中具有空字符的字符串,即,您正在打印仅包含不可打印字符的以空字符结尾的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.