无法按预期打印字符数组

Not able to print the char array as thought

本文关键字:打印 字符 数组      更新时间:2023-10-16
#include <fstream>
#include<iostream>
#include<cstring>
using namespace std;
class Address {
public:
    char addr[6];
    Address() {}
    Address(string address) {
        size_t pos = address.find(":");
        int id = stoi(address.substr(0, pos));
        short port = (short)stoi(address.substr(pos + 1, address.size()-pos-1));
        memcpy(addr, &id, sizeof(int));
        memcpy(&addr[4], &port, sizeof(short));
    }
};
enum MsgTypes{
    JOINREQ,
    JOINREPLY,
    DUMMYLASTMSGTYPE,
    HEARTBEAT
};
/**
 * STRUCT NAME: MessageHdr
 *
 * DESCRIPTION: Header and content of a message
 */
typedef struct MessageHdr {
    enum MsgTypes msgType;
}MessageHdr;
    typedef struct en_msg {
        // Number of bytes after the class
        int size;
        // Source node
        Address from;
        // Destination node
        Address to;
    }en_msg;
//class Testing{
void send(Address *myaddr, Address *toaddr, char *data, int size);
    int main()
    {
        MessageHdr *msg=new MessageHdr();
        size_t msgsize = sizeof(MessageHdr) + sizeof(Address) + sizeof(long) + 1;
        msg=(MessageHdr  *)malloc(msgsize*sizeof(char));
        int id=233;
        short  port =22;
        long heartbeat=1;
        msg=(MessageHdr  *)malloc(msgsize*sizeof(char));
        string s=to_string(id)+":"+to_string(port);
        string s1=to_string(id+1)+":"+to_string(port+1);
        cout<<s<<'n';
        cout<<s1<<'n';
        Address *addr= new Address(s);
        for (int i = 0; i < 6; i++)
            cout << addr->addr[i];
        Address *toaddr= new Address(s1);
        msg->msgType = JOINREQ;
        //cout<<(char *)msg->msgType;
        memcpy((char *)(msg+1), addr, sizeof(addr));
        memcpy((char *)(msg+1) + 1 + sizeof(addr), &heartbeat, sizeof(long));
        send(addr, toaddr, (char *)msg,  msgsize);
        return 0;
    }
        void send(Address *myaddr, Address *toaddr, char *data, int size) {
            cout<<"inside send"<<'n';
        en_msg *em;
//static char temp[2048];
        em = (en_msg *)malloc(sizeof(en_msg) + size);
        em->size = size;
        memcpy(&(em->from), &(myaddr), sizeof(em->from));
        memcpy(&(em->to), &(toaddr), sizeof(em->from));
        memcpy(em + 1, data, size);
        cout<<(char *)(em+1);
    }

这是我的程序,在两者之间,我正在尝试检查存储在我的 char 数组中的地址。 但是在打印数组时,它会给出一些奇怪的输出。 打印 s 和 s1 的值后的两个奇怪符号。 我正在尝试将 id:port 存储在地址类的 char 数组中,但看起来没有成功。请帮忙

我所指的用于打印的代码在主函数中。主功能下行约十行。

比如说,我的 id 是 233,端口是 22,地址是 233:22 我想

找回 233:22 并打印出来。我该怎么做?

提前致谢:)

问题出在这一行:

cout << addr->addr[i];

因为addr->addr是一个char数组,每个元素都会被打印成它所代表的字符。如果您希望打印每个整数值,只需先将其转换为int即可。

cout << static_cast<int>(addr->addr[i]); // or old-fashioned: (int)addr->addr[i];

给定以下代码:

for (int i = 0; i <= 6; i++)
            cout << addr->addr[i];

并给定Address的构造函数:

size_t pos = address.find(":");
int id = stoi(address.substr(0, pos));
short port = (short)stoi(address.substr(pos + 1, address.size()-pos-1));
memcpy(addr, &id, sizeof(int));
memcpy(&addr[4], &port, sizeof(short));

很明显,您正在打印符合数字的字节

addr->addr 是一个包含两个整数变量的 char 数组,一个具有两个字节 (int(,另一个具有 2 个字节(短(。

因此,如果数字是 ,假设为 436,则您正在打印:

0xB4 0x01 0x00 0x00 
<crazy char> SOH NULL  NULL

您必须了解您正在打印的内容或要打印的内容才能正确打印。

注意:这里假设最流行的设置,这意味着:

  • 小端序建筑
  • 4 字节整数
  • 2 字节短

更新

如何取回地址和端口:

int address;
unsigned short port;
memset(&address, addr->addr, 4);
memset(&port, addr->addr+4, 2);