こんにちは高木です。今回も別サイトで過去に投稿した内容のリライトになります。
先日書いたように、C++の触りだけを学習するのであれば、ナル終端文字列を使わずにstd::stringで代用できそうです。では、std::stringでどこまで済ませることができるでしょうか? 今回はそれを考察してみることにします。
まず、今回対象とするのはあくまでも標準規格の範囲内とします。OSのシステムコールやサードパーティのライブラリまで範囲に含めると、ナル終端文字列無しでは済まないでしょうから、その場合は話が別と考えてください。
真っ先に思いつくのはファイル操作です。
std::fopenを使うにはナル終端文字列が必要です。しかし、これはstd::fstreamで代替できます。std::fstreamのコンストラクタにはstd::filesystem::pathを渡すことでいろいろ融通が利くようになると思います。
実際、標準Cライブラリを除けば、ナル終端文字列が必要な場面というのはなさそうです。std::strtol関数などは使う機会も多いのですが、これはstd::istringstreamで代用できます。どうしても標準Cライブラリを使わなければならない状況は限られています。
関数の返却値がナル終端文字列であっても、std::stringで受ければナル終端文字列は表に出てきません。いろいろ考えた結果、標準Cライブラリでどうしても避けられないのはstd::getenv関数だけのようです。
あと、それ以外でナル終端文字列をプログラマーが意識しないといけないケースがひとつだけあります。main関数の引数がそうです。
std::getenv関数は入門者には不要かもしれませんが、main関数の引数は避けて通れません。逆にいえば、main関数の引数を扱うときが、ナル終端文字列について紹介するべきタイミングなのかもしれませんね。