-1

我正在使用带有使用 C++ 的 SMING 框架的 ESP8266 Wifi 芯片。我有一个 tcpServer 函数,它从 TCP 端口接收数据。我想将传入的数据转换char *data为字符串数据类型。这就是我所做的。

bool tcpServerClientReceive(TcpClient& client, char *data, int size)
{
    String rx_data;
    rx_data = String(data);
    Serial.printf("rx_data=%s\r",rx_data);
}

内容rx_data很垃圾。代码有什么问题?如何制作rx_data成合适的字符串?

4

1 回答 1

2

为什么你做错了

AC 样式字符串是一个数组,char其中最后一个元素是0字节。这就是现在字符串结束处的功能。他们扫描下一个字符,直到找到这个零字节。C ++ 字符串是一个可以保存附加数据的类。

例如,要获取字符串的长度,可以选择将搅拌的长度存储在类的成员中,并在每次修改字符串时更新它。如果字符串被修改,这意味着额外的工作,它使调用 t 的长度变得简单而快速,因为它只是返回存储的值。

另一方面,对于 C 字符串,长度必须遍历数组并计算字符数,直到找到空字节。因此 runimestrlen取决于字符串的长度。

解决方案:

如上所述,您必须正确打印它,请尝试:

#include <iostream>
...
std::cout << "rx_data=" << rx_data << std::endl;

或者,如果您坚持使用 printf (为什么要使用 c++?),您可以使用string::c_str(), 或(从 C++11 开始,在 reutrned 数组可能不会以 null 终止之前)string::data():您的代码将变为:

Serial.printf("rx_data=%s\r",rx_data.c_str());

我建议您查看std::string以了解详细信息。事实上,如果你有时间,一本好书可以帮助解释很多重要的概念,包括容器,比如std::stringor std::vector。不要以为你知道 C 就知道如何编写 C++。

于 2016-02-02T08:59:06.637 回答