我正在使用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
变成正确的字符串?
答案 0 :(得分:2)
C样式字符串是char
的数组,其中最后一个元素是0
字节。这就是函数现在字符串结束的方式。他们扫描下一个字符,直到找到这个零字节。 C++ string是一个可以保存其他数据的类。
例如,为了获得字符串的长度,可以选择将sting的长度存储在类的成员中,并在每次修改字符串时更新它。虽然这意味着如果修改字符串会增加额外的工作,这会使调用t的长度变得微不足道,因为它只返回存储的值。
对于C字符串,另一方面,长度必须遍历数组并计算字符数,直到找到空字节。因此strlen
的运行时间取决于字符串的长度。
如上所述,你必须正确打印,尝试:
#include <iostream>
...
std::cout << "rx_data=" << rx_data << std::endl;
或者如果你坚持使用printf(为什么还要使用c ++?),你可以使用string::c_str()
,或者(因为C ++ 11,在reolned数组可能不会被空终止之前)string::data()
:你的代码将成为:
Serial.printf("rx_data=%s\r",rx_data.c_str());
我建议您查看std::string以了解详细信息。事实上,如果你有时间,一本好书可以帮助解释很多重要的概念,包括容器,如std::string
或std::vector
。不要认为因为你知道C,你知道如何编写C ++。