9

C/C++ では、文字列は NULL で終了します。

C#stringstreamのようにメモリ ストリームとして使用できますか?MemoryStream

メモリ ストリームのデータは\0、データの途中で値を持つ場合がありますが、C++ 文字列は NULL で終了します。

4

3 に答える 3

8

文字シーケンスを に格納する場合、std::stringヌル文字を含めることができます。同様に、astd::stringstreamは埋め込まれたヌル文字も処理できます。ただし、ストリームに対するさまざまな書式設定された操作は、null 文字を通過しません。また、組み込み文字列を使用しstd::stringて null 文字に値を代入する場合は問題になります。つまり、文字シーケンスのサイズを引数として取るさまざまなオーバーロードを使用する必要があります。

正確に何を達成しようとしていますか?糸の流れで移動するよりも簡単なアプローチがあるかもしれません。たとえば、ストリーム インターフェイスを読み取ってメモリ バッファーとやり取りする場合、カスタム ストリーム バッファーを作成してセットアップするのは非常に簡単です。

struct membuf
    : std::streambuf 
{
        membuf(char* base, std::size_t size) {
        this->setp(base, base + size);
        this->setg(base, base, base + size);
    }
    std::size_t written() const { return this->pptr() - this->pbase(); }
    std::size_t read() const    { return this->gptr() - this->eback(); }
};

int main() {
    // obtain a buffer starting at base with size size
    membuf       sbuf(base, size);
    std::ostream out(&sbuf);
    out.write("1\08\09\0", 6); // write three digits and three null chars
}
于 2012-11-24T16:16:08.250 に答える
5

C/C++ では、文字列は NULL で終了します。

  • 2 つの完全に異なる言語 (構文にいくつかの共通点があります)。しかし、C は、Jave が C# に似ているのと同じくらい C++ に似ています (異なるという点で)。

各言語には独自の文字列機能があります。

  • C では、慣例により '\0' バイトで終了する一連のバイトが使用されます。
    • 一般に C 文字列と呼ばれます。
    • このメモリ領域について特別なことは何もありません。単なるバイトのシーケンスです。
    • 慣習の強制はなく、構築するための標準的な方法もありません。
    • これは、C プログラムのバグの巨大な領域です。
  • C++ はクラス (メソッド付き) std::string を使用します。

C# の MemoryStream のように stringstream をメモリ ストリームとして使用できますか?

もちろん。メモリ ストリームは、(ファイルではなく) メモリによってサポートされるストリームです。これはまさに std::stringstream です。インターフェイスにはいくつかの違いがありますが、これらはマイナーなものであり、ドキュメントを使用すると混乱を簡単に解決できます。

メモリ ストリームのデータは、データの途中で \0 値を持つ場合がありますが、C++ 文字列は NULL で終了します。

これは完全に間違っています。

  • C 文字列は '\0' で終了しています。
  • C++ std::string は null で終了せず、任意の文字を含めることができます
于 2012-11-24T17:39:22.133 に答える
1

memcpy()C と C++ は 2 つの異なる言語であり、C の連続する文字列は文字列を意味し、memset()、、 を使用して、その値を設定/取得できるメモリ部分として扱うことができますmemcmp()

C++ では、文字列とは、正しいデータを文字列として取得するために使用される情報のクラスを意味します。したがって、タイプを持つメモリ位置のシーケンスとして扱うことはできませんchar

于 2012-11-24T15:22:06.443 に答える