C++: C言語形式文字列
最終更新:2026-08-31
C++では
std::stringが推奨されるが、Cスタイル文字列(char配列)の理解も重要——多くのレガシーコードや低レベルAPIで使用されている。
1. C言語形式文字列とは何か?
(1) 1.1 定義
C言語形式文字列はNULL終端されたcharの配列。
CPP
char str[] = "Hello"; // {'H', 'e', 'l', 'l', 'o', '\0'}
(2) 1.2 NULL終端
すべてのC言語形式文字列はNULL文字('\0')で終わる。これが文字列の終わりを示す。
TEXT
📖 参照専用
文字列: H e l l o \0
インデックス: 0 1 2 3 4 5
💡 ヒント: "Hello"は5文字だが、配列サイズは6(NULL終端を含む)。
2. 宣言と初期化
(1) 2.1 文字列リテラル
CPP
char str[] = "Hello"; // サイズは自動的に6になる
char str[10] = "Hello"; // 残りは\0で埋められる
(2) 2.2 文字配列
CPP
char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
(3) 2.3 ポインタ
CPP
const char* str = "Hello"; // 文字列リテラルへのポインタ
3. 文字列関数
<cstring>ヘッダーで提供される。
(1) 3.1 strlen
文字列の長さを返す(NULL終端を除く)。
CPP
#include <cstring>
#include <iostream>
int main() {
char str[] = "Hello";
std::cout << strlen(str) << std::endl; // 5
return 0;
}
(2) 3.2 strcpy
文字列をコピー。
CPP
#include <cstring>
#include <iostream>
int main() {
char src[] = "Hello";
char dest[10];
strcpy(dest, src);
std::cout << dest << std::endl; // Hello
return 0;
}
⚠️ 注意: コピー先が十分なサイズか確認すること!
(3) 3.3 strcat
文字列を連結。
CPP
#include <cstring>
#include <iostream>
int main() {
char str[20] = "Hello";
strcat(str, " World");
std::cout << str << std::endl; // Hello World
return 0;
}
(4) 3.4 strcmp
文字列を比較。
CPP
#include <cstring>
#include <iostream>
int main() {
char s1[] = "Apple";
char s2[] = "Banana";
if (strcmp(s1, s2) < 0) {
std::cout << s1 << " < " << s2 << std::endl;
}
return 0;
}
4. 文字列入力
(1) 4.1 cin
CPP
char name[50];
std::cin >> name; // スペースで止まる
(2) 4.2 cin.getline
CPP
char sentence[100];
std::cin.getline(sentence, 100); // 行全体を読み取る
▶ サンプル 1:文字列の長さを計算(難易度 ⭐)
CPP
#include <iostream>
#include <cstring>
int main() {
char str[100];
std::cout << "文字列を入力: ";
std::cin.getline(str, 100);
std::cout << "長さ: " << strlen(str) << std::endl;
return 0;
}
▶ サンプル 2:文字列を逆順に(難易度 ⭐⭐)
CPP
#include <iostream>
#include <cstring>
void reverseString(char str[]) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char temp = str[i];
str[i] = str[len - 1 - i];
str[len - 1 - i] = temp;
}
}
int main() {
char str[] = "Hello";
reverseString(str);
std::cout << str << std::endl; // olleH
return 0;
}
▶ サンプル 3:文字列内の文字をカウント(難易度 ⭐⭐)
CPP
#include <iostream>
#include <cstring>
int countChar(const char str[], char ch) {
int count = 0;
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == ch) {
count++;
}
}
return count;
}
int main() {
char text[] = "Hello World";
char target = 'l';
std::cout << "'" << target << "'の出現回数: "
<< countChar(text, target) << std::endl;
return 0;
}
❓ よくある質問
Q C言語形式文字列とstd::stringの違いは?
A
std::stringはサイズ可変、メモリ管理自動、安全。C言語形式文字列は固定サイズ、手動管理、バグの原因になりやすい。Q なぜC言語形式文字列を学ぶ必要がある?
A レガシーコード、C API、パフォーマンス重視の場面で使用される。理解しておくと役立つ。
Q バッファオーバーフローとは?
A 配列サイズを超えて書き込むこと。C言語形式文字列でよく発生する危険なバグ。常にサイズを確認すること。
📖 まとめ
- C言語形式文字列はNULL終端されたchar配列
- NULL文字(
'\0')が文字列の終わりを示す <cstring>に関数がある:strlen、strcpy、strcat、strcmp- 入力には
cin.getlineを使う(スペースを含む場合) - 可能なら
std::stringを使う
📝 練習問題
-
初級(難易度 ⭐): C言語形式文字列の長さを
strlenを使わずに計算。 -
中級(難易度 ⭐⭐): 文字列内の特定の文字をカウントする関数を書く。
-
上級(難易度 ⭐⭐⭐): 2つの文字列を連結し、結果を新しい配列に格納する関数を書く。