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


10

私は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&引数を使用する意味はありますか?

5
主にC APIとのインターフェース。
クルミ

@uneven_markの例を提供できますか?
Sailanarmo

リンクした4番目の質問に対する承認済みの回答は、この質問に対する回答のようです。
フランソワアンドリュー

1
@Sailanarmo const char*引数を取るPOSIXやその他のCライブラリなどのほとんどの関数。エエロリカの答えには例があります。
ウォールナット

1
@FrançoisAndrieux本当に答えは、「APIがnullで終了する文字列を呼び出さない限り?」
Sailanarmo

回答:


10

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

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

execve例として(POSIX標準の)関数を見てみましょう。

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

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


したがって、この場合、パス名は、それがである場合、次のstd::stringように実行されexecve(pathname.c_str(),...,...)ますか?
Sailanarmo

6

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

char*/ const char*プラスサイズを取る関数、またはデータの最初と最後をマークする2つのポインタだけの場合、nullで終了する文字列は必要ありません。 nullターミネーター。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.