目次
はじめに
C++やC言語で、char
配列を使ったC言語スタイルの文字列を扱う際、文字列の長さを取得したり、コピーや連結を行ったりする基本的な操作が頻繁に必要になります。これらの操作を自力で実装するのは大変ですが、標準ライブラリの <cstring>
(C言語では <string.h>
) ヘッダーファイルに、便利な関数が多数用意されています。
この記事では、その中でも特に使用頻度の高い、以下の3つの基本的な文字列操作関数について、使い方を解説します。
strlen()
: 文字列の長さを取得するstrcpy()
: 文字列をコピーするstrcat()
: 文字列を連結する
文字列操作関数のサンプルコード
このコードは、strcpy
で初期文字列をコピーし、strcat
で文字列を追加連結し、最後にstrlen
で全体の長さを調べて表示します。
完成コード
#include <iostream>
#include <cstring> // strlen, strcpy, strcat を使うために必要
using namespace std;
int main() {
// 操作を行うための、十分な大きさのchar配列を準備
char buffer[100];
// 1. strcpy (string copy) で文字列をコピー
strcpy(buffer, "Hello");
cout << "strcpy後: " << buffer << endl;
// 2. strcat (string concatenate) で文字列を連結
strcat(buffer, ", World!");
cout << "strcat後: " << buffer << endl;
// 3. strlen (string length) で文字列の長さを取得
// 終端ヌル文字('\0')は長さに含まない
int length = strlen(buffer);
cout << "strlenで取得した長さ: " << length << endl;
return 0;
}
実行結果
strcpy後: Hello
strcat後: Hello, World!
strlenで取得した長さ: 13
各関数の解説
1. strlen(文字列)
**str
**ing **len
**gth(文字列の長さ)
- 機能: 引数で渡されたC言語スタイルの文字列の文字数を返します。
- 注意点: 文字数のカウントは、文字列の終わりを示す終端ヌル文字 (
\0
) の直前までです。ヌル文字自体は長さに含まれません。
2. strcpy(コピー先, コピー元)
**str
**ing c
opy
(文字列のコピー)
- 機能: 第2引数(コピー元)の文字列を、第1引数(コピー先)の
char
配列に上書きコピーします。終端ヌル文字も含めてコピーされます。 - 注意点: コピー先の配列が、コピー元の文字列を格納するのに十分な大きさを持っていることを、プログラマが保証する必要があります。サイズが足りないと、メモリを破壊する深刻なバグ(バッファオーバーフロー)の原因となります。
3. strcat(連結先, 連結元)
**str
ing concat
**enate(文字列の連結)
- 機能: 第1引数(連結先)の文字列の末尾(終端ヌル文字の位置)に、第2引数(連結元)の文字列を連結します。
- 注意点:
strcpy
と同様に、連結先の配列が、連結後の文字列全体を格納するのに十分な大きさを持っている必要があります。
まとめ
今回は、<cstring>
ライブラリに含まれる、C言語スタイルの文字列を操作するための3つの基本的な関数を解説しました。
strlen()
: 文字列の長さを調べる。strcpy()
: 文字列をコピー(上書き)する。strcat()
: 文字列を末尾に連結する。
これらの関数はC言語時代から使われている基本的なツールですが、バッファオーバーフローという深刻なセキュリティリスクを内包しています。現代のC++では、これらのリスクを自動で管理してくれる、より安全で高機能な std::string
クラスを使うことが強く推奨されます。