文字列リテラルで初期化した場合は、文字列の末尾を知らせるために配列末尾へ暗黙的にヌル終端の文字が含まれるため、長さに注意する。
ヌル終端を持たない文字列の処理は、不具合や未定義動作につながるため扱いに注意する。
定義の書式
char 変数名[長さ(省略可)] 初期化の構文;配列からポインタへの変換(decay)
配列(C言語)なのでArray decayを起こす。
リテラル
文字列(C言語)のリテラルは、プログラム実行時に作成される定数オブジェクトで、プログラム全体で存在が保証されている。(静的記憶域)
入力を受け取る
C++20以前では、std::cin >> による文字列(C言語)への抽出は、空白文字が見つかるまで可能な限り文字を読み取ろうとする。
そのため、用意した文字列(C言語)の長さ以上の入力があると、バッファオーバーフローを引き起こす危険がある。
文字列(C言語)へ安全に行単位入力するには、std::cin.getline(std::istream のメンバ関数)を使う。
std::cin.getline(入力先文字列, 入力可能文字数);文字列の長さを取得する
<cstring>ヘッダで提供されるstd::strlen()を利用できる。これはdecayされた配列にも動作し、ヌル終端文字をのぞいた文字列の長さを取得できる。
内部的にはヌル終端文字が見つかるため配列を操作して長さを調べるため、遅い操作である。
C++での扱い
ヌル終端を失う可能性のある文字列の操作を避けるために、非constな文字列は代わりにstd::stringを利用するのが望ましい。