Я использую чип WSP ESP8266 с платформой SMING, которая использует C ++. У меня есть функция 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 ++ строка это класс, который может содержать дополнительные данные.
Например, чтобы получить длину строки, можно сохранить длину перемешивания в члене класса и обновлять ее при каждом изменении строки. Хотя это означает дополнительную работу, если строка модифицирована, она делает длину вызова t тривиальной и быстрой, поскольку она просто возвращает сохраненное значение.
Для строк C, с другой стороны, длина должна перебирать массив и считать количество символов, пока не найдет нулевой байт. таким образом, runime strlen
зависит от длины струны.
Как указано выше, вы должны распечатать его правильно, попробуйте либо:
#include <iostream>
...
std::cout << "rx_data=" << rx_data << std::endl;
или если вы настаиваете на printf (зачем тогда использовать c ++?), вы можете использовать либо string::c_str()
, или (начиная с C ++ 11, до того, как возвращаемый массив не может быть завершен нулем) string::data()
: ваш код станет:
Serial.printf("rx_data=%s\r",rx_data.c_str());
Я хотел бы предложить вам взглянуть на станд :: строка чтобы получить представление о деталях. На самом деле, если у вас есть время, хорошая книга может помочь объяснить множество важных понятий, включая контейнеры, такие как std::string
или же std::vector
, Не думайте, что, поскольку вы знаете C, вы знаете, как писать на C ++.
Других решений пока нет …