【问题标题】:Parsing and slicing char[] in C++在 C++ 中解析和切片 char[]
【发布时间】:2020-07-22 16:37:45
【问题描述】:

我有以下代码:

char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;

int iResult = recv(this->ClientSocket, recvbuf, recvbuflen, 0);
if (iResult > 0) {
    printf("Message received: %s\n", recvbuf);
    std::string recvbuf = recvbuf;
    printf("Message as string: %s\n", recvbuf);
    std::string msg = recvbuf.substr(0, recvbuf.find('0x0D', 0));
    printf("Message after slicing: %s\n", msg);
}

输出是这样的:

Message received: jess╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠°÷u
Message as string: ╪≥u
Message is exactly: ┤≥u

如何从初始数组中提取jess 并将其转换为字符串?

【问题讨论】:

  • @thibsc 我不知道,但我会试着找出答案

标签: c++ arrays string


【解决方案1】:

首先,缓冲区似乎不是以空值结尾的,所以你应该使用

basic_string( const CharT* s,
              size_type count,
              const Allocator& alloc = Allocator() );

用指定的大小初始化字符串。

其次,字符串初始化无法访问缓冲区,因为名称冲突。

第三,%s 不会接受std::string。

另请注意,您可以使用%.*s 格式说明符指定要动态打印的长度。

char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;

int iResult = recv(this->ClientSocket, recvbuf, recvbuflen, 0);
if (iResult > 0) {
    printf("Message received: %.*s\n", iResult, recvbuf);
    std::string recvbuf2(recvbuf, iResult);
    printf("Message as string: %s\n", recvbuf2.c_str());
    std::string msg = recvbuf2.substr(0, recvbuf2.find('0x0D', 0));
    printf("Message after slicing: %s\n", msg.c_str());
}

(注意:'0x0D' 是多字符字面量,其值是实现定义的)

【讨论】:

  • 另外值得记住的是,recv 提供了它可用的内容,或者,如果没有可用的数据,则阻塞直到数据可用。它不能保证你得到你所期望的一切。例如,对于 TCP 套接字,数据以流的形式出现,recv 将从该流中读取多达 DEFAULT_BUFLEN 字节。您只能收到“Jess”的一部分,或者远不止“Jess”。使用 UDP 套接字,您会收到离散消息,因此包含“Jess”的消息要么全部存在,要么不存在,但您无法获得交付或订购保证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多