2

pBeginポインター (および)を持つ文字範囲がありますpEnd。私はそれを文字列と考えていますが、\0終了していません。効果的に印刷するにはどうすればよいstd::coutですか?

  • のように、コピーを作成せずにstd::string
  • 各文字を出力するループなし

良い解決策はありますか?そうでない場合、最もスムーズな回避策は何ですか?

4

2 に答える 2

6

ポインターと長さの引数を取るostream::writeを使用できます。

std::cout.write(pBegin, pEnd - pBegin);
于 2013-07-12T11:07:21.270 に答える
0

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 を使用している場合はQStringViewQStringRef残念ながらQStringUTF-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の要素を指しており、配列の末尾を超えていないことを確認してください。

于 2013-12-21T14:03:56.850 に答える