-1

I am using ESP8266 Wifi chip with the SMING framework which uses C++. I have a tcpServer function which receives data from a TCP port. I would like to convert the incoming char *data into String data type. This is what I did.

bool tcpServerClientReceive(TcpClient& client, char *data, int size)
{
    String rx_data;
    rx_data = String(data);
    Serial.printf("rx_data=%s\r",rx_data);
}

The contents of rx_data is rubbish. What is wrong with the code? How to make rx_data into a proper string?

4

1 に答える 1

2

あなたがしていることが間違っている理由:

AC スタイルの文字列はchar、最後の要素が0バイトである配列です。これは、文字列が終了する場所で機能する方法です。このゼロバイトが見つかるまで、次の文字をスキャンします。C ++ 文字列は、追加データを保持できるクラスです。

たとえば、文字列の長さを取得するには、攪拌の長さをクラスのメンバーに保存し、文字列が変更されるたびに更新することを選択できます。これは、文字列が変更された場合に追加の作業が必要になることを意味しますが、格納された値を返すだけなので、t length の呼び出しは簡単で高速になります。

一方、C 文字列の場合、長さは配列をループし、null バイトが見つかるまで文字数をカウントする必要があります。したがって、の実行時間はstrlen文字列の長さに依存します。

ソリューション:

上で指摘したように、正しく印刷する必要があります。次のいずれかを試してください。

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

または、printf を主張する場合 (なぜ C++ を使用するのですか?) string::c_str()、 または (C++11 以降、返された配列が null で終了しない可能性がある前に) を使用できstring::data()ます。コードは次のようになります。

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

詳細については、 std::stringをご覧になることをお勧めします。実際、時間があれば、 や などのコンテナーを含む多くの重要な概念を説明するのに良い本が役立ちstd::stringますstd::vector。C を知っているからといって、C++ の書き方を知っていると思い込まないでください。

于 2016-02-02T08:59:06.637 に答える