【问题标题】:Get string from starting index to end from char Array从 char Array 获取从起始索引到结束的字符串
【发布时间】:2012-02-03 09:42:48
【问题描述】:

我有一个带有 char 数组的对象;其中前 5 个字节(C++ 中的字符)是附加数据,之后的所有内容都是字符串消息。

所以我的问题是如何获取从起始索引 5 到最后一个字节的字符串?

我知道有 memccpy,但它需要一个结束字符,我事先不知道。 我知道 C++ 中有一个字符串对象,但想法是来回发送一个包含数据和消息的字节数组。所以从某种意义上说,我来回序列化和反序列化。

有什么建议吗?

编辑:

Packet * Packet::create(byte const data[])
{
    //Concat all first 4 byte values to a uint32
    unsigned int length = data[0] << 32 | data[1] << 16 | data[2] << 8 | data[3] << 0;

    //4th element is packet type
    PacketType type = (PacketType)data[4];

    string packetData;

    packetData.clear();
    char * cdata;
    //Check packet data is present
    if(sizeof(data) > 5)
    {
        //string s((char)data);
        //packetData = s.substr(4, s.length() - 4);
        strncat(cdata,data+5,sizeof(data)-5);
        packetData.append(cdata);
    }

    //Create new packet;
    Packet * packet = new Packet(length,type,packetData);

    return packet;
};

即使我将它转换为 char,它也不会接受 data[]。 参数不是指针?

编辑::

Packet * Packet::create(char const * data)
{
    //Concat all first 4 byte values to a uint32
    unsigned int length = data[0] << 32 | data[1] << 16 | data[2] << 8 | data[3] << 0;

    //4th element is packet type
    PacketType type = (PacketType)data[4];

    //Set packet data, if available
    string packetData = (sizeof(data) > 5) ? string(data+5):"";

    Packet * packet = new Packet(length,type,packetData);
    return packet;
};

我还是要测试这个,但是我必须使用char,这种情况下我该如何使用自己的typedef?

还有什么区别 “字符 * 数据” 和 "字符数据[]"

我认为数组和指针是一回事。

【问题讨论】:

  • 使用:strncpystrcpy,并且数组在内存中是连续的,所以只需使用 (source + 5) 作为源缓冲区,这样可以确保您从源字符数组中的第 5 个字符开始复制。跨度>
  • 如果您可以更改您的消费者以接受开始/结束对,那么您根本不需要制作任何副本...
  • sizeof(data) 是错误的。它会给你指针的大小,而不是它指向的 c 字符串的长度。请改用strlen(data)

标签: c++ arrays string char


【解决方案1】:

您提到“知道有 memccpy,但它需要一个结束字符,我事先无法知道”。这是否意味着您的序列化数据既没有数据大小也没有分隔符?没有那个你怎么期望 “字符串数据包数据=(大小(数据)> 5)?字符串(数据+ 5):”“;” 去工作? 对于序列化,您也可以在标题中发送数据的大小。然后使用简单的 memcpy。

【讨论】:

    【解决方案2】:

    使用strcpycharArray + 5 作为源参数。

    您还应该知道strlen,它为您提供了字符串的长度[可能需要分配char[],如果不知道它的上限]。

    编辑:代码快照:

    #include <iostream>
    #include <cstring>
    using namespace std;
    int main() { 
      char in[] = "XXXXXqwerty";
      //dynamic allocation using strlen() if you don't have upper bound for in
      char* out = new char[strlen(in) - 4]; 
      strcpy(out,in+5);
      cout << out;
      delete[] out;
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多