我有一个包含多个不同类型成员的结构。我想将此结构复制到缓冲区,然后连接一条消息供以后使用(将它们分开并读取结构和消息,我在这里没有这样做)。这是我的代码。
#define DAT "d"
#define ACK "a"
#define SYN "s"
#define FIN "f"
#define RST "r"
typedef struct Headers { //total 20 bytes
unsigned char _magic_[7];
unsigned char _type_[1];
union {
unsigned int _seq_; //4 bytes
unsigned int _ack_; //4 bytes
} no;
unsigned int _length_; //4 bytes
unsigned short _size_; //2 bytes
} Header;
int main() {
Header receiver_header;
char buffer[1024];
strcpy(receiver_header._magic_, "ABCDEF");
strcpy(receiver_header._type_, DAT);
receiver_header.no._ack_ = 0;
receiver_header._length_ = 900;
receiver_header._size_ = 10240;
char foo[] = "A random message";
memcpy(buffer, &receiver_header, sizeof(Header));
strcat(buffer, foo);
printf("%s\n", buffer);
}
输出是
ABCDEFA random message
我的问题是
是否需要将成员强制转换为相同类型才能将它们复制到缓冲区中?
为什么我已经声明了正确的源指针和它的长度,其余成员在缓冲区中消失了?
最佳答案
Header
的第一个成员 _magic_
包含 7 个 char
。您复制了 6 个 char
(“ABCDEF”),后跟一个空字符。 strcat
在遇到第一个空字符时将源字符串复制到目标字符串中。因此,它会在 Header
的前六个字节之后立即附加“A random message”。如果要在整个结构之后附加消息,则需要指定要复制到的偏移量,如下所示。
strcpy(buffer + sizeof(Header), foo);
但是,它不会打印整个结构,因为空字符仍然紧跟在“ABCDEF”之后,即使 foo
已附加到正确的偏移量处。如果您想打印结构中的所有内容,只需显式打印出每个成员,就像这样。
printf("%s %c %u %u %hu %s",
receiver_header._magic_,
receiver_header._type[0],
reveiver_header.no._ack_,
receiver_header._length_,
receiver_header._size_,
foo);
关于将具有不同类型成员的结构复制到缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42729097/