将字符*转换为字符串 我使用的是使用C++的SIME框架的ESP8266 WiFi芯片。我有一个tcpServer函数,它从TCP端口接收数据。我想将传入的char*数据转换为字符串数据类型。这就是我所做的 bool tcpServerClientReceive(TcpClient& client, char *data, int size) { String rx_data; rx_data = String(data); Serial.printf("rx_data=%s\r",rx_data); }

将字符*转换为字符串 我使用的是使用C++的SIME框架的ESP8266 WiFi芯片。我有一个tcpServer函数,它从TCP端口接收数据。我想将传入的char*数据转换为字符串数据类型。这就是我所做的 bool tcpServerClientReceive(TcpClient& client, char *data, int size) { String rx_data; rx_data = String(data); Serial.printf("rx_data=%s\r",rx_data); },c++,string,char,esp8266,sming,C++,String,Char,Esp8266,Sming,rx\u数据的内容是垃圾。代码有什么问题?如何将rx\u数据转换成正确的字符串 为什么你所做的是错误的: C样式的字符串是一个字符数组,其中最后一个元素是0字节。这就是现在字符串结束时的工作方式。他们扫描下一个字符,直到找到这个零字节。是一个可以保存额外数据的类 例如,要获取字符串的长度,可以选择将stirng的长度存储在类的成员中,并在每次修改字符串时更新它。虽然这意味着如果字符串被修改,将需要额外的工作,但它会使调用t length变得简单和快速,因为它只返回存储的值 另一方面,对于C字符串

rx\u数据的内容是垃圾。代码有什么问题?如何将
rx\u数据
转换成正确的字符串

为什么你所做的是错误的: C样式的字符串是一个字符数组,其中最后一个元素是
0
字节。这就是现在字符串结束时的工作方式。他们扫描下一个字符,直到找到这个零字节。是一个可以保存额外数据的类

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

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

解决方案: 如上所述,您必须正确打印,请尝试以下任一方法:

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

我建议你看一下,了解一下细节。事实上,如果你有时间,一本好书可以帮助你解释很多重要的概念,包括容器,比如
std::string
std::vector
。不要假设,因为你知道C,你知道如何写C++。< /P>也许在数据末尾缺少了‘0’:按你打印的方式尝试数据[Stase]='0',它看起来像垃圾。尝试
Serial.printf(“rx\u数据=%s\r”,(const char*)rx\u数据)Serial.printf
是一个可变参数函数,并且
String
是一个合适的类,则代码>比编写的代码更合适。可以合法地作为var args传递的内容非常有限。使其定义良好的唯一方法是对可以传递给varargs函数的类型使用适当的强制转换。@user1824987:如果您给出一些示例,应该会更好。此外,您还可以使用调试器查看内部数据以及为什么rx_数据是垃圾这不是问题,但使用默认构造函数创建
字符串
对象,然后创建一个临时对象来分配给它是浪费时间的。只需使用以下参数创建它:
stringrx\u数据(data)
Serial.printf("rx_data=%s\r",rx_data.c_str());