C++の文字列 (std::string)
Cの[スタイル]の文字列([文字]配列)は[扱いが面倒]で、[バグも起こりやすい](バッファ[オーバーフロー]や、\0の[書き忘れ]など)。
C++ には string クラス が用意されており、string をオブジェクトとしてカプセル化することで、安全かつ便利に利用できます。
1. 文字列とは何ですか?
(1) 1.1 [生活における]クラス[比]
| [生活シーン] | 番組[での対応] |
|---|---|
| [リュックサックがあります],[そこに物を入れられます] | 文字列オブジェクト |
| [リュックの容量が自動で拡大する]([入らなくなったら大きいものに替える]) | string [動的管理]memory |
| [リュックにはポケットがいくつかある]、[物を取り出しやすい] | string [の]メンバー関数 |
string [の利点]:
- [気にしなくてよい]メモリ——[自動割り当てと解放]
- [無視] \0——[終了文字の自動処理]
- [強力な機能]――[結合]、[検索]、[置換]がすべて便利
(2) 1.2 [なぜ] string を使うのか?
[用途] C [スタイル] 文字列([注意点]):
▶ サンプル 2: codeexample (難易度 ⭐)
#include iostream
#include cstring
int main() {
char greeting[50] = "Hello, ";
char name = "MOTO";
std::strcat(greeting, name); // ...
std::cout << greeting << std::endl;
return 0;
}
[用] 文字列([簡単]):
#include iostream
#include string
int main() {
std::string greeting = "Hello, ";
std::string name = "MOTO";
greeting += name; //,
std::cout << greeting << std::endl;
return 0;
}
2. 文字列の宣言と初期化
基本的な使い方
#include iostream
#include string
int main() {
//:
std::string s1 = "Hello";
//:
std::string s2("World");
//:
std::string s3(5, '*'); // "*"
std::cout << s1 << " " << s2 << " " << s3 << std::endl;
return 0;
}
出力:
Hello World *
💡 [重要]: [使用] string [必須] #include string。
3. 文字列 [の一般的な操作]
(1) 3.1 [連結]string(+ [と] +=)
#include iostream
#include string
int main() {
std::string firstName = "MOTO";
std::string lastName = "Zhang";
//: +
std::string fullName1 = firstName + " " + lastName;
std::cout << fullName1 << std::endl; // MOTO Zhang
//: +=
std::string fullName2 = firstName;
fullName2 += " ";
fullName2 += lastName;
std::cout << fullName2 << std::endl; // MOTO Zhang
return 0;
}
(2) 3.2 [長さの取得](length [および] size)
#include iostream
#include string
int main() {
std::string name = "MOTO";
std::cout << "name: " << name << std::endl;
std::cout << "length(): " << name.length() << std::endl; // 4
std::cout << "size(): " << name.size() << std::endl; // 4
return 0;
}
💡 [ヒント]: length() [と] size() [はまったく同じ]なので、[どちらを使っても構いません]。
(3) 3.3 [個々の文字へのアクセス]( [および] at)
#include iostream
#include string
int main() {
std::string name = "MOTO";
//:
std::cout << name[0] << std::endl; // M
name[0] = 'm'; // ...
//: at()()
std::cout << name.at(1) << std::endl; // o
// name.at(10); // ❌ exception( )
return 0;
}
💡 [違い]:
name[i]— [境界越えをチェックしない]、[効率が高い]name.at(i)— [境界外チェック]、[安全だが少し遅い]
4. string [のよく使われる]メンバ関数
(1) 4.1 [部分文字列の検索](find)
#include iostream
#include string
int main() {
std::string text = "Hello, World!";
// ...
size_t pos = text.find("World");
if (pos != std::string::npos) {
std::cout << "\"World\",:" << pos << std::endl; // 7
} else {
std::cout << "..." << std::endl;
}
return 0;
}
💡 [ヒント]: [見つからない場合は]、find() [に戻る] std::string::npos([通常は] -1 [の符号なしバージョン])。
(2) 4.2 [部分文字列の抽出](substr)
#include iostream
#include string
int main() {
std::string email = "moto@example.com";
//: 0, 4
std::string user = email.substr(0, 4);
std::cout << ":" << user << std::endl; // moto
//: 5,
std::string domain = email.substr(5);
std::cout << ":" << domain << std::endl; // example.com
return 0;
}
(3) 4.3 [部分文字列の置換](replace)
#include iostream
#include string
int main() {
std::string text = "Hello, World!";
//: 7,2, "C++"
text.replace(7, 5, "C++");
std::cout << text << std::endl; // Hello, C++!
return 0;
}
5. 入力[和]出力文字列
(1) 5.1 [cin を使用して] [読み込む]([スペースに遭遇したら停止])
#include iostream
#include string
int main() {
std::string name;
std::cout << ":";
std::cin >> name; // ⚠️
std::cout << "," << name << "!" << std::endl;
return 0;
}
[動作結果]:
Zhang,MOTO! ← "MOTO"
(2) 5.2 [使用] getline [行全体を読み込む]([推奨])
#include iostream
#include string
int main() {
std::string fullName;
std::cout << ":";
std::getline(std::cin, fullName); // ✅ ()
std::cout << "," << fullName << "!" << std::endl;
return 0;
}
[動作結果]:
Zhang,MOTO Zhang! ←
💡 [重要]: [もし前に] cin >> を使った場合は、[必ず] cin.ignore() を追加して、[改行コードを削除] してください!
6. 演習:[簡単なテキスト処理]
▶ サンプル 1: [単語の数を数える] (難易度 ⭐⭐)
#include iostream
#include string
#include sstream // stringstream
int main() {
std::string line;
std::cout << ":";
std::getline(std::cin, line);
// stringstream points
std::istringstream ss(line);
std::string word;
int count = 0;
while (ss >> word) {
count++;
}
std::cout << ":" << count << std::endl;
return 0;
}
[動作結果]:
World, this is C++!:5
7. [よくある]エラー
(1) 7.1 [忘れた] #include string
エラー例:
#include iostream // ❌ string
int main() {
std::string name = "MOTO"; // ❌ compilation
return 0;
}
[修正]: [追加] #include string。
(2) 7.2 [使用] cin >> [スペースを含む文字列を読み込む]
エラー例:
#include iostream
#include string
int main() {
std::string address;
std::cout << ":";
std::cin >> address; // ❌
std::cout << ":" << address << std::endl;
return 0;
}
[修正]: [使用] std::getline()。
❓ よくある質問
std::stringstream [または] std::string::reserve() [を使用して、事前にメモリを割り当ててください]。📖 まとめ
- string [は] C++ [の] string クラスであり、[C スタイルの] string [よりも安全] で、[使いやすい]
- [必須]
#include string - [よく使う操作]:
+/+=[連結]、length()/size()[長さの取得]、find()[検索]、substr()[部分文字列の抽出] - [行全体を読み込む場合]
std::getline() string[自動的に管理される]メモリ、[心配不要]バッファ[オーバーフロー]
📝 練習問題
-
初心者(難易度 ⭐): [プログラム]を作成し、[ユーザーに][2つの]文字列を入力させ、[それらを結合して]出力する。
-
中級(難易度 ⭐⭐): [プログラム]を作成し、[ユーザーに][1つの]文字列を入力させ、[その中に数字の文字('0'~'9')がいくつ含まれているか]を数える。
-
上級(難易度 ⭐⭐⭐): [「簡単な学生情報管理システム」を[実装]する]プログラムを作成してください:
-
[使用]
string[氏名]、[学生番号]、[専攻] -
[追加]、[検索]、[全生徒情報の表示]機能の実装
-
([任意])[データを]fileに保存する
-
std::string [は] C++ [標準ライブラリ]のstringであり、[メモリを自動管理]する
-
文字列 [サポート] + [連結]、== [比較]、 [インデックスによるアクセス]
-
[よく使われるメソッド]:length/size/substr/find/append
-
文字列 [と] C [スタイル] 文字列 [の相互変換]:c_str()
-
[処理]input[時の注意点] getline [と] cin >> [の併用によるバッファの問題]
8. 🚀 次は
[学習済み] string,[次は] struct(struct)([第]20[課])を学びます―― [複数の異なる]型[の]変数[を1つの単位としてまとめる]もので、[これは]「class」[への]前段階です!



