C++文字列完全マスター:Cスタイル文字列 vs std::string
C++には以下の2種類の文字列表現があります:
- Cスタイル文字列
- 標準C++で導入された string クラス型
Cスタイル文字列
Cスタイル文字列はC言語で誕生し、C++でも引き続きサポートされています。この文字列は実際には、null 文字 '\0' で終了する1次元の文字配列です。したがって、null終端文字列は、文字列を構成する文字に続いて null が続きます。
以下の宣言と初期化は、"Hello" という単語で構成される文字列を作成します。配列の末尾に null 文字を保持するため、文字列 "Hello" の文字数より1つ大きいサイズの文字配列が必要です。
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
配列初期化のルールに従うと、上記文は以下のようにも書けます:
char greeting[] = "Hello";
上記で定義した文字列のC/C++でのメモリ表現:
実際には、文字列定数の末尾に null 文字を置く必要はありません。C++コンパイラは、配列を初期化する際に自動的に末尾に '\0' を配置します。上記文字列を出力してみましょう:
Live Demo#include <iostream>
using namespace std;
int main () {
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << "Greeting message: ";
cout << greeting << endl;
return 0;
}
上記コードをコンパイルして実行すると、以下の結果が得られます:
Greeting message: Hello
C++は、null終端文字列を操作する幅広い関数をサポートしています:
| No. | 関数と目的 |
|---|---|
| 1 | strcpy(s1, s2); 文字列s2を文字列s1にコピーする。 |
| 2 | strcat(s1, s2); 文字列s2を文字列s1の末尾に連結する。 |
| 3 | strlen(s1); 文字列s1の長さを返す。 |
| 4 | strcmp(s1, s2); s1とs2が同一なら0、s1<s2なら0未満、s1>s2なら0より大きい値を返す。 |
| 5 | strchr(s1, ch); 文字列s1内で文字chが最初に出現する位置へのポインタを返す。 |
| 6 | strstr(s1, s2); 文字列s1内で文字列s2が最初に出現する位置へのポインタを返す。 |
上記関数のいくつかを使用した例:
Live Demo#include <iostream>
#include <cstring>
using namespace std;
int main () {
char str1[10] = "Hello";
char str2[10] = "World";
char str3[10];
int len ;
// str1をstr3にコピー
strcpy( str3, str1);
cout << "strcpy( str3, str1) : " << str3 << endl;
// str1とstr2を連結
strcat( str1, str2);
cout << "strcat( str1, str2): " << str1 << endl;
// 連結後のstr1の総長
len = strlen(str1);
cout << "strlen(str1) : " << len << endl;
return 0;
}
上記コードをコンパイルして実行すると、以下のような結果が得られます:
strcpy( str3, str1) : Hello strcat( str1, str2): HelloWorld strlen(str1) : 10
C++の string クラス
標準C++ライブラリは、上記すべての操作をサポートし、さらに多くの機能を提供する string クラス型を提供しています。次の例を見てみましょう:
Live Demo#include <iostream>
#include <string>
using namespace std;
int main () {
string str1 = "Hello";
string str2 = "World";
string str3;
int len ;
// str1をstr3にコピー
str3 = str1;
cout << "str3 : " << str3 << endl;
// str1とstr2を連結
str3 = str1 + str2;
cout << "str1 + str2 : " << str3 << endl;
// 連結後のstr3の総長
len = str3.size();
cout << "str3.size() : " << len << endl;
return 0;
}
上記コードをコンパイルして実行すると、以下のような結果が得られます:
str3 : Hello str1 + str2 : HelloWorld str3.size() : 10
C言語
- C# 文字列をマスターする:基礎、操作、高度なテクニック
- C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
- C++コメント完全ガイド:読みやすく保守しやすいコードのためのベストプラクティス
- C++クラステンプレート完全ガイド:実践的なジェネリックプログラミング
- C++変数とデータ型:int、double、char、string、boolを徹底解説
- C++文字列関数をマスター:strcpy、strcat、strlen、strcmpの実践例
- C 言語の文字列をマスター: 宣言、入力、出力、ライブラリ関数
- C++プログラミング言語:概要と主要機能
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Java Enumの文字列表現マスター:デフォルト、オーバーライド、高度なパターン
- Java Stringクラス完全ガイド:生成、操作、主要メソッド46選