将 char* 转换为字符串

Convert char* into String

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

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 变成正确的字符串?

为什么你的做法是错误的:

C 风格字符串是 char 的数组,其中最后一个元素是 0 字节。这就是现在字符串结束处的功能。他们扫描下一个字符,直到找到这个零字节。 C++ string 是一个 class 可以容纳额外的数据。

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

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

解决方法:

正如上面所指出的,您必须正确打印它,请尝试以下任一方法:

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

或者如果您坚持使用 printf(那为什么要使用 c++?),您可以使用 string::c_str(), or (since C++11, before the reutrned array might not be null terminated) string::data():您的代码将变为:

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

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