我正在使用ESP8266 Wifi芯片和使用该C++的SMING框架。我有一个从TCP端口接收数据的tcpServer函数。我想将传入的char *data
转换为字符串数据类型。这就是我所做的。
bool tcpServerClientReceive(TcpClient& client, char *data, int size)
{
String rx_data;
rx_data = String(data);
Serial.printf("rx_data=%sr",rx_data);
}
rx_data
的内容物是垃圾。代码有什么问题?如何使rx_data
变成合适的字符串?
为什么你做的事情是错误的:
C 样式字符串是一个char
数组,其中最后一个元素是0
字节。这就是字符串结束处的函数方式。他们扫描下一个字符,直到找到这个零字节。C++字符串是一个可以保存其他数据的类。
可以选择将 stirng 的长度存储在类的成员中,并在每次修改字符串时更新它。虽然这意味着如果字符串被修改,它会使调用 t 长度变得简单而快速,因为它只是返回存储的值。
另一方面,对于 C 字符串,长度必须遍历数组并计算字符数,直到找到空字节。 因此,strlen
的符文取决于字符串的长度。
解决方案:
如上所述,您必须正确打印它,请尝试:
#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=%sr",rx_data.c_str());
我建议你看看std::string以了解细节。事实上,如果你有时间,一本好书可以帮助解释很多重要的概念,包括容器,如std::string
或std::vector
。不要以为因为你知道C,你就知道如何写C++。