目次
はじめに
C++やC言語におけるC言語スタイルの文字列(C-style string)は、内部的には終端NULL文字 ('\0'
) で終わる文字 (char
) の配列です。この「必ず \0
で終わる」という特性を利用することで、文字列の長さを事前に知らなくても、for
ループやwhile
ループを使って文字列の先頭から末尾までを1文字ずつ処理することができます。
この記事では、文字列の終端NULL文字をループの終了条件として使い、文字列を1文字ずつ処理する基本的な方法を解説します。
文字列を1文字ずつループ処理するサンプルコード
このコードは、"Welcome"
という文字列をchar
配列に格納し、for
ループを使って1文字ずつ取り出し、文字の間にハイフン -
を入れて表示します。
完成コード
#include <iostream>
using namespace inspace std;
int main() {
// 文字列リテラルでchar配列を初期化
char message[] = "Welcome";
cout << "元の文字列: " << message << endl;
cout << "1文字ずつ処理した結果: ";
// ループで配列の各文字を処理
// message[i]が終端NULL文字('\0')でない限り、ループを続ける
for(int i = 0; message[i] != '\0'; i++) {
// i番目の文字とハイフンを出力
cout << message[i] << '-';
}
cout << endl; // 最後に改行
return 0;
}
実行結果
元の文字列: Welcome
1文字ずつ処理した結果: W-e-l-c-o-m-e-
コードの解説
for(int i = 0; message[i] != '\0'; i++)
この for
ループが、C言語スタイルの文字列を処理するための定石です。
- 初期化 (
int i = 0
): 配列の先頭インデックス0
からループを開始します。 - 継続条件 (
message[i] != '\0'
): これが核心部分です。「message
配列のi
番目の文字が、終端NULL文字\0
ではない間」ループを続けます。i
がインクリメントされ、message[i]
が文字列の最後の文字の次、つまり\0
に到達した時点で、この条件はfalse
となり、ループが終了します。 - 更新 (
i++
): ループの各回の最後に、インデックスを一つ進めます。
この方法を使えば、strlen()
のような関数で事前に文字列の長さを調べる必要がなく、どんな長さのC言語スタイルの文字列でも、その終わりまでを正確に処理することができます。
まとめ
今回は、終端NULL文字 (\0
) を利用して、C言語スタイルの文字列を1文字ずつループ処理する方法を解説しました。
- C言語スタイルの文字列は、必ず終端NULL文字 (
'\0'
) で終わる。 - ループの継続条件を
配列名[i] != '\0'
とすることで、文字列の終わりまでを安全に処理できる。
std::string
が主流の現代C++では出番が減りましたが、このテクニックは文字列の基本的な仕組みを理解する上で非常に重要であり、C言語との互換性が求められる場面などでは今でも使われます。