404 Not Found

404 Not Found


nginx

C++の文字列 (std::string)

Cの[スタイル]の文字列([文字]配列)は[扱いが面倒]で、[バグも起こりやすい](バッファ[オーバーフロー]や、\0の[書き忘れ]など)。

C++ には string クラス が用意されており、string をオブジェクトとしてカプセル化することで、安全かつ便利に利用できます。


1. 文字列とは何ですか?

(1) 1.1 [生活における]クラス[比]

[生活シーン] 番組[での対応]
[リュックサックがあります],[そこに物を入れられます] 文字列オブジェクト
[リュックの容量が自動で拡大する]([入らなくなったら大きいものに替える]) string [動的管理]memory
[リュックにはポケットがいくつかある]、[物を取り出しやすい] string [の]メンバー関数

string [の利点]:

  1. [気にしなくてよい]メモリ——[自動割り当てと解放]
  2. [無視] \0——[終了文字の自動処理]
  3. [強力な機能]――[結合]、[検索]、[置換]がすべて便利

(2) 1.2 [なぜ] string を使うのか?

[用途] C [スタイル] 文字列([注意点]):

▶ サンプル 2: codeexample (難易度 ⭐)

CPP
#include iostream
#include cstring

int main() {
 char greeting[50] = "Hello, ";
 char name = "MOTO";
 
 std::strcat(greeting, name); // ...
 std::cout << greeting << std::endl;
 
 return 0;
}
▶ 試してみよう

[用] 文字列([簡単]):

CPP
#include iostream
#include string

int main() {
 std::string greeting = "Hello, ";
 std::string name = "MOTO";
 
 greeting += name; //,
 std::cout << greeting << std::endl;
 
 return 0;
}


2. 文字列の宣言と初期化

基本的な使い方

CPP
#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;
}

出力:

TEXT
Hello World *

💡 [重要]: [使用] string [必須] #include string



3. 文字列 [の一般的な操作]

(1) 3.1 [連結]string(+ [と] +=)

CPP
#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)

CPP
#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)

CPP
#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;
}

💡 [違い]:



4. string [のよく使われる]メンバ関数

(1) 4.1 [部分文字列の検索](find)

CPP
#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)

CPP
#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)

CPP
#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 を使用して] [読み込む]([スペースに遭遇したら停止])

CPP
#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 [行全体を読み込む]([推奨])

CPP
#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: [単語の数を数える] (難易度 ⭐⭐)

CPP
#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

エラー例:

CPP
#include iostream // ❌ string

int main() {
 std::string name = "MOTO"; // ❌ compilation
 return 0;
}

[修正]: [追加] #include string

(2) 7.2 [使用] cin >> [スペースを含む文字列を読み込む]

エラー例:

CPP
#include iostream
#include string

int main() {
 std::string address;
 
 std::cout << ":";
 std::cin >> address; // ❌
 
 std::cout << ":" << address << std::endl;
 
 return 0;
}

[修正]: [使用] std::getline()


❓ よくある質問

Q string [と] char [は相互に変換できますか]? A:[できます]! > > // string → char > std::string s = "Hello"; > const char cstr = s.c_str(); // [const char を返す] > > // char → string > char cstr = "Hello"; > std::string s = cstr; // [自動変換] >** Q:[なぜ私の]文字列の[連結が遅い]のですか?
A [連結のたびにメモリが再割り当てされる]可能性があります。[ループ内で連結を行う場合は]、std::stringstream [または] std::string::reserve() [を使用して、事前にメモリを割り当ててください]。
Q string [中国語の文字を格納できますか]?
A [できます]![ただし、]ソースファイルが UTF-8 [エンコーディング] であり、[かつターミナルが] UTF-8 をサポートしていることを確認してください。 > > std::string name = "[張三]"; // [中国語を格納できます] > std::cout << name << std::endl; >

📖 まとめ

  • string [は] C++ [の] string クラスであり、[C スタイルの] string [よりも安全] で、[使いやすい]
  • [必須] #include string
  • [よく使う操作]:+ / += [連結]、length() / size() [長さの取得]、find() [検索]、substr() [部分文字列の抽出]
  • [行全体を読み込む場合] std::getline()
  • string [自動的に管理される]メモリ、[心配不要]バッファ[オーバーフロー]

📝 練習問題

  1. 初心者(難易度 ⭐): [プログラム]を作成し、[ユーザーに][2つの]文字列を入力させ、[それらを結合して]出力する。

  2. 中級(難易度 ⭐⭐): [プログラム]を作成し、[ユーザーに][1つの]文字列を入力させ、[その中に数字の文字('0'~'9')がいくつ含まれているか]を数える。

  3. 上級(難易度 ⭐⭐⭐): [「簡単な学生情報管理システム」を[実装]する]プログラムを作成してください:

  • [使用] string [氏名]、[学生番号]、[専攻]

  • [追加]、[検索]、[全生徒情報の表示]機能の実装

  • ([任意])[データを]fileに保存する

  • std::string [は] C++ [標準ライブラリ]のstringであり、[メモリを自動管理]する

  • 文字列 [サポート] + [連結]、== [比較]、 [インデックスによるアクセス]

  • [よく使われるメソッド]:length/size/substr/find/append

  • 文字列 [と] C [スタイル] 文字列 [の相互変換]:c_str()

  • [処理]input[時の注意点] getline [と] cin >> [の併用によるバッファの問題]


8. 🚀 次は

[学習済み] string,[次は] struct(struct)([第]20[課])を学びます―― [複数の異なる]型[の]変数[を1つの単位としてまとめる]もので、[これは]「class」[への]前段階です!

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%