C 11 の `string::c_str()` は依然として Null で終了する文字列を保証しますか?

Mary-Kate Olsen
リリース: 2024-10-27 15:35:02
オリジナル
343 人が閲覧しました

 Does C  11's `string::c_str()` Still Guarantee a Null-Terminated String?

C 11 の string::c_str() 関数は Null 終端ではなくなりましたか?

C では、basic_string クラスがさまざまなメソッドを提供します。その文字にアクセスします。これらのメソッドの 1 つである c_str() は、C 11 以降混乱の原因となってきました。C 11 より前では、c_str() は文字列の内容を表す null で終了する文字配列を返す役割を担っていました。

ただし、 C 11 では、basic_string::c_str() の定義が変更されました。これは、basic_string::data と同じになるように定義されるようになり、文字列の内部文字バッファーの先頭へのポインターを返します。これにより疑問が生じました: この変更は、c_str() がヌル終了文字列を保証しなくなったことを意味しますか?

答え: 文字列には内部的にヌル終了バッファが必要です

この質問に対する答えはノーです。 C 11 での変更にもかかわらず、文字列は依然として内部で null 終了バッファを使用する必要があります。これは、C 標準の Operator[] メソッド (21.4.5) の定義から明らかです。

Requires: pos <= size().
Returns: *(begin()+pos) if pos < size(), otherwise a reference to an object of type T with value charT(); the referenced value shall not be modified.
ログイン後にコピー

c_str() は、operator[]:

Returns: A pointer p such that p + i == &operator[](i) for each i in [0,size()].
ログイン後にコピー
c_str() と data は両方とも O(1) 操作である必要があるため、実装では事実上 null 終了バッファの使用が強制されます。さらに、operator[] の戻り値要件により、c_str() が null で終了するバッファへのポインタを返すことが保証されます。したがって、C 11.

での変更にもかかわらず、c_str() は引き続きヌル終了文字列を提供します。

以上がC 11 の `string::c_str()` は依然として Null で終了する文字列を保証しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!