微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何处理插入 '\0' 的字符数组?

如何解决如何处理插入 '\0' 的字符数组?

当我尝试使用 memcpy 函数将结构复制到字符数组缓冲区时,'\0' 被插入到字符数组中。我将缓冲区指针传递给一个函数。第一个 '\0' 之前的内容已经过去,但其余的都丢失了。我怎么解决这个问题?如果您能帮助我,我将不胜感激。

这里是代码,虽然结构体Mystruct和函数display()设计不合理。

#include <QCoreApplication>

#include <stdio.h>

struct MyStruct
{
    char c;
    int order;
    char ch;
    MyStruct(char c = 'b',int order = 0,char ch = 'a'):order(order),ch(ch),c(c)
    {};
};

void display(char* str)
{
    printf("%s",str);
}

int main(int argc,char *argv[])
{
    QCoreApplication a(argc,argv);

    MyStruct *mystruct = new MyStruct;
//    char* test = new char[50];
    char test[50];
    memset(test,50);

    memcpy(test,mystruct,sizeof(MyStruct));

    display(test);


    return a.exec();
}

我想通过套接字发送像“Mystruct”这样的结构,并且函数 send(char*) 需要一个指向缓冲区的 char* 指针。 '\0' 是在 int 顺序复制到 test[50] 中时插入到 char 数组中的。

我们使用 QT 的 QTcpsocket::write(char*) 而不是 Linux 或 Windows 提供的 API。我的队友给我提供了一个接口函数 send(char )。我需要传递 char 指针指向的缓冲区。

我用显示代码简化了我的问题,并为我令人困惑的表达道歉。通过套接字发送结构的任何好方法

解决方法

C 字符串函数适用于空终止字符串。

如果你想用 nul 非终端字符串处理 char*,你需要大小(或其他哨兵)。

MyStruct mystruct;

std::string buffer {(char*) &mystruct,sizeof (MyStruct)};

Demo

请注意,这种序列化方式有很多陷阱:

  • 填充(您可能会看到 corder 之间以及 ch 之后的随机值(那些 0 是随机的))。
  • 字节序问题。
  • ...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。