pBegin
ポインター (および)を持つ文字範囲がありますpEnd
。私はそれを文字列と考えていますが、\0
終了していません。効果的に印刷するにはどうすればよいstd::cout
ですか?
- のように、コピーを作成せずに
std::string
- 各文字を出力するループなし
良い解決策はありますか?そうでない場合、最もスムーズな回避策は何ですか?
ポインターと長さの引数を取るostream::writeを使用できます。
std::cout.write(pBegin, pEnd - pBegin);
C++17以降、コピーせずにstd::string_view
一部を共有するために作成された を使用できますstd::string
std::cout << std::string_view(pBegin, pEnd - pBegin);
pEnd
出力する最後の文字の代わりに、C++ の反復子がどのように機能するかのように、出力する最後の文字を 1 つのパスに指定する必要があります。
古い C++ 標準boost::string_ref
では代替手段です。新しいブースト バージョンにはboost::string_view
、 と同じセマンティクスもありstd::string_view
ます。boost::string_ref と boost::string_view の違いを参照してください。
Qt を使用している場合はQStringView
、QStringRef
残念ながらQString
UTF-8 またはバイト指向エンコーディングではなく UTF-16 でデータを保存する表示に使用されますが、
ただし、外部ライブラリなしでnull で終わる文字列を必要とする関数で文字列を処理する必要がある場合は、簡単な解決策があります。
char tmpEnd = *pEnd; // backup the after-end character
*pEnd = '\0';
std::cout << pBegin; // use it as normal C-style string, like dosomething(pBegin);
*pEnd = tmpEnd; // restore the char
この場合、 が元の配列内pEnd
の要素を指しており、配列の末尾を超えていないことを確認してください。