C++文字列関数をマスター:strcpy、strcat、strlen、strcmpの実践例
文字列とは
文字列とは単純に文字のシーケンスです。現代のC++では通常、std::stringクラスのオブジェクトを扱います。これはメモリ割り当て、リサイズ、豊富なメンバ関数を自動的に処理するため、手動のバッファ管理が不要になり、バッファオーバーフローのリスクが軽減されます。
教育目的のため、C++は従来のCスタイルのヌル終端文字配列もサポートしています。両アプローチにはそれぞれ用途があります:日常的なプログラミングにはstd::stringを使用し、レガシーAPIやパフォーマンスクリティカルな低レベルコードにはCスタイル文字列を使用します。
文字列の宣言
- Cスタイル文字列:ヌル文字(
\0)で終端される1次元char配列 - std::string:C++標準ライブラリのクラスで、文字列操作の豊富なインターフェースを提供
Cスタイル文字列
例:
char name[5] = {'J', 'o', 'h', 'n', '\0'};
より簡潔には:
char name[] = "John"; // コンパイラが終端'\0'を自動挿入
std::string
std::stringを使用するにはヘッダをインクルードし変数を宣言:
#include <string> std::string name = "John";
文字列値へのアクセス
以下はCスタイル文字列とstd::stringの値を出力する簡単なコンソールプログラムです。
#include <iostream>
#include <string>
using namespace std;
int main() {
char cName[5] = "John"; // Cスタイル文字列
string cppName = "Guru99"; // std::string
cout << "C-style string: " << cName << endl;
cout << "std::string: " << cppName << endl;
return 0;
}
出力:
主要なC文字列関数
これらの関数はcstringヘッダで定義されています。Cスタイル文字列(ヌル終端char配列)を操作します。
strcpy()
ソース文字列をデスティネーションバッファにコピーします。デスティネーションはソースを保持するのに十分な大きさでなければなりません。
strcpy(dest, src); // destは十分なスペースが必要
strcat()
ソース文字列をデスティネーション文字列の末尾に追加します。同様にデスティネーションバッファは結果を収容するのに十分な大きさでなければなりません。
strcat(dest, src); // destは十分なスペースが必要
strlen()
終端ヌルバイトを除く文字列の文字数を返します。
size_t len = strlen(str);
strcmp()
2つの文字列を辞書順で比較します。等しければ0、最初の文字列が小さければ負の値、大きければ正の値を返します。
int cmp = strcmp(str1, str2);
実践例
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char name1[10] = "Guru99";
char name2[10] = "John";
char name3[20]; // 連結結果を保持できるサイズを確保
// コピー
strcpy(name3, name1);
cout << "strcpy(name3, name1): " << name3 << endl;
// 連結
strcat(name1, name2);
cout << "strcat(name1, name2): " << name1 << endl;
// 長さ
size_t len = strlen(name1);
cout << "strlen(name1): " << len << endl;
// 比較
int cmp = strcmp(name1, name3);
cout << "strcmp(name1, name3): " << cmp << endl;
return 0;
}
出力:
ポイント
- ほとんどのC++コードでは
std::stringを使用 – より安全で簡単 - 生の文字配列を扱う必要がある場合、
cstring関数が必須 - デスティネーションバッファが常に十分な大きさであることを確認し、オーバーフローを防止
- 長さが必要な場合のみ
strlenを使用;std::stringオブジェクトにはstd::string::size()が推奨 - レガシーAPIには
strcmp;現代的C++ではstd::string::compare()やオーバーロードされたoperator==の方が明確
C言語
- C++変数とデータ型:int、double、char、string、boolを徹底解説
- C++配列を徹底解説:宣言、初期化、ポインタ活用テクニック
- C++ do-while文:構文、実践例、ネストしたループ
- C++ポインタをマスター:概念、例、実践的応用
- C++ char型をマスター:宣言、ASCII、変換テクニック
- C++演算子オーバーロード:コード例付き実践ガイド
- C++関数を実例で徹底解説:基本から応用まで
- C 言語の文字列をマスター: 宣言、入力、出力、ライブラリ関数
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Java Enumの文字列表現マスター:デフォルト、オーバーライド、高度なパターン
- Java String.indexOf()マスター:部分文字列検索と実践例