私は、CS 専攻としての 1 年目の準備として、ここ数日間 C++ を独学で学んでいます。私は現在、C スタイルの文字列を使用しており、null ターミネータのポイントが何であるか疑問に思っています。
それが必要であることは理解していますが、文字列が最後の文字で終わらない理由を根本的に理解していないと思います。
私は、CS 専攻としての 1 年目の準備として、ここ数日間 C++ を独学で学んでいます。私は現在、C スタイルの文字列を使用しており、null ターミネータのポイントが何であるか疑問に思っています。
それが必要であることは理解していますが、文字列が最後の文字で終わらない理由を根本的に理解していないと思います。
文字列が最後の文字で終わらない理由が根本的に理解できません。
「最後の文字」がどこにあるかを知る方法はいくつかあります。
C 2 番目のルートを選択します。他の言語 (Pascal など) は最初のルートを選択します。C++ の一部の実装ではstd::string
、3 番目のルート*が選択されます。
std::string
、ライブラリの C 部分との互換性のためにバッファーを null で終了します。これはc_str()
、 が有効な C 文字列を返すようにするために必要です。
C および C++ では、c-string は文字配列に格納されます。さまざまな長さの文字列を許可するために、これらの配列は、多くの場合、含まれる実際の文字列よりもはるかに大きく割り当てられます。たとえば、プログラマはchar[256]
配列を割り当てることができます。この配列は、0 ~ 255 文字の間の長さの文字列を保持できます。ただし、コンピュータは文字列が実際にどれくらいの長さであるかを正確に認識できなければならないため、文字列は null 文字で終わる必要があります。 . それ以外の場合は、文字配列の長さを文字列とまったく同じにする必要があります (メモリの割り当てとコピーは多くのリソースを使用するため、非現実的な解決策です)。
文字列の各文字をメモリ内のメモリ ブロックと見なします。文字列がメモリに配置されている場合。その後、別の文字列がそれに隣接して配置され、null が存在しない場合、コンピューターは 2 番目の文字列が 1 番目に結合されていると見なします。したがって、 null は区切り記号として機能します
C スタイルの文字列は最後の文字が何文字か分からないためです。たとえば、名前を読んでいる場合、次のようにバッファを作成できます。
char buf[256] // this allows c-style strings that contain 255 characters
ただし、そのバッファーにデータを入力する場合、すべてのスペースを使用することはできません (使用しない可能性があります)。「Jack」と入力すると、気にする情報は最初の 5 つのインデックスだけであり、256 個すべてではありません。