web-dev-qa-db-ja.com

読み取り専用のシナリオでnullで終了する文字列が必要になるのはいつですか?

私は std::string_view ライブラリをいじってみましたが、std::string_viewをできるだけ使用するように取り組んでいるコードベースの変更を検討しています。ただし、std::string_viewではなくconst std::string &をいつどのように使用するかについて私が読んだスレッドの多くでは。 「nullで終了する文字列が必要ないとき」と多くの回答が言うのを見てきました。それで、私がWebを検索し始めたとき、「いつnullで終了する文字列が必要ですか?」この件に関して役立つ答えを見つけたことはありません。

リンクする外部ライブラリの例として、std::stringが必要だと思います。そしてその場合、ライブラリがそれを必要とするので、ヌルで終了する文字列が必要になります。別の例としては、文字列自体を変更する必要がある場合があると思いますが、変更する必要がある場合はconst &を渡さないでしょう。

では、nullで終了する文字列をいつ使用する必要があるでしょうか。

私が見たリンク:

  1. std :: string_viewはconst std :: string&よりも正確に高速ですか?
  2. std :: string_viewではなくconst&std :: stringを渡すのはいつですか?
  3. なぜ文字列ビューだけですか?
  4. C++ 17でconst std :: string&引数を使用する意味はありますか?
10
Sailanarmo

Nullで終了する文字列はいつ必要ですか?

使用するAPIで必要な場合は、ヌル文字で終了する文字列が必要です。この要件はCインターフェイスの至る所にあり、一部のドキュメントでは明示的に述べられていません。関数の引数がchar*(おそらくconstへ)で、長さの引数はありません。ドキュメンテーションに別の指示がない限り、要件を想定する必要があります。

例として、関数execve(POSIX標準から)を取り上げます。

int execve(const char *pathname, char *const argv[], char *const envp[]);

Null以外で終了する引数をpathnameとして渡すと、プログラムの動作は未定義になります。

10
eerorika

実際にはかなり簡単に知ることができます。 c文字列(char*/const char*)のみをとる関数を呼び出す場合は、nullで終了する文字列が必要です。これが、文字列の終わりがどこにあるかを知る唯一の方法だからです。

代わりに、char*/const char*にサイズを加えた関数、またはデータの開始と終了を示す2つのポインタのみを使用する関数がある場合は、nullで終了する文字列は必要ありません。/nullターミネータを繰り返さなくても文字列サイズを取得できます。

6
NathanOliver