C++ 文字列関数: strcpy()、strcat()、strlen()、strcmp()

⚡ スマートサマリー

C++ strcpy、strcat、strlen、strcmpなどの文字列関数を使用すると、プログラムはテキストのコピー、結合、計測、比較を行うことができます。このリソースでは、文字列とは何か、Cスタイルおよびstd::string形式の文字列の宣言方法、値へのアクセス方法、および主要な文字列関数の適用方法を例を交えて解説します。

  • 🔤 コア定義: 文字列とは文字の並びのことです。 C++ string は std::string クラスのオブジェクトです。
  • 🧱 2つの宣言: C++ '\0'で終端されるCスタイルの文字配列と、より安全なstd::stringクラス型をサポートします。
  • 📥 値へのアクセス: 文字列は名前で読み込まれ、出力されます。char配列とstd::stringの両方を使用してその方法を示します。
  • 🛠️ 文字列関数: strcpyは文字列をコピーし、strcatは文字列を連結し、strlenは文字列の長さを測定し、strcmpは2つの文字列を比較します。
  • 📦 ヘッダーは必須です。 C言語の文字列関数はcstringヘッダーファイルに含まれており、使用する前に必ずインクルードする必要があります。

C++ 文字列関数

文字列とは

文字列は文字の並びです。 C++ stringはstd::stringクラスのオブジェクトです。文字はバイト列として格納され、1バイト単位での文字へのアクセスが可能です。

C++ 文字列は動的にメモリを割り当てます。必要に応じて、実行時に文字列にさらにメモリを割り当てることができます。メモリの事前割り当てがないため、メモリの無駄遣いはありません。文字列に対して、比較、連結、変換など、さまざまな操作を実行できます。

文字列の宣言

C++ 2 種類の文字列宣言をサポートします。

  • Cスタイルの文字列
  • 文字列クラス型

C スタイルの文字列

このタイプの文字列宣言は Cプログラミング言語. C++ 引き続きサポートしています。これは単にヌル文字 (\0) で終端される文字の 1 次元配列です。ヌル終端文字列は、文字列を構成する文字の後にヌル文字が続きます。

以下の文字列宣言を考えてみましょう。

char name[5] = {'J', 'o', 'h', 'n', '\0'};

上記の宣言は、「John」という単語を構成する文字列を作成します。この単語は4文字ですが、文字列のサイズは5文字です。余分なスペースは、ヌル文字を格納するために設けられています。

配列初期化ルールを使用すると、上記のステートメントを次のように記述できます。

char name[] = "John";

文字列定数の末尾にヌル文字を配置する必要はないことに注意してください。 C++ コンパイラは、配列を初期化するときに、文字列の末尾に自動的に '\0' を配置します。

std ::文字列

標準 C++ このライブラリは、さまざまな文字列操作をサポートする文字列クラスを提供します。これはstd::stringと表記されます。

このクラスを使用するには、まず以下に示すように、#include プリプロセッサを使用してワークスペースにこのクラスを含める必要があります。

#include <string>

次に、string キーワードを使用して文字列を宣言できます。 例えば:

string name = "John";

上記のステートメントは、値 John を保持する name という名前の文字列を作成します。

文字列値へのアクセス

In C++、文字列名を使用して文字列値にアクセスできます。 例えば:

#include <iostream>
using namespace std;
int main() {
	char name[5] = { 'J', 'o', 'h', 'n', '\0' };
	cout << "String value is: ";
	cout << name << endl;
	return 0;
}

出力:

文字列値へのアクセス

コードのスクリーンショットは次のとおりです。

文字列値へのアクセス

Code 説明:

  1. コードに iostream ヘッダー ファイルを含めます。 これにより、コンソールからの読み取りとコンソールへの書き込みが可能になります。
  2. std 名前空間を含めて、そのクラスと関数を呼び出さずに使用できるようにします。
  3. プログラムのロジックを追加するmain()関数を呼び出します。{はmain()関数の本体の開始を示します。
  4. 文字列を宣言し、名前を付けます。 文字列には値 John が格納されます。 余分なスペースにはヌル文字が格納されます。
  5. コンソールにテキストを出力します。
  6. name という名前の文字列の値をコンソールに出力します。
  7. プログラムが正常に実行される場合、main() 関数は値を返す必要があります。
  8. main() 関数の本体の終わり。

もう一つの例は C++ 標準文字列クラス:

#include <iostream>
#include <string>
using namespace std;
int main() {

	string name = "Guru99";

	cout << "The name is : " << name << endl;

	return 0;
}

出力:

文字列値へのアクセス

コードのスクリーンショットは次のとおりです。

文字列値へのアクセス

Code 説明:

  1. コードに iostream ヘッダー ファイルを含めます。 これにより、コンソールからの読み取りとコンソールへの書き込みが可能になります。
  2. コードに標準の文字列クラスを含めます。
  3. std 名前空間を含めて、そのクラスと関数を呼び出さずに使用できるようにします。
  4. プログラムのロジックを追加するmain()関数を呼び出します。{はmain()関数の本体の開始を示します。
  5. 文字列を宣言し、名前を name とします。文字列には値が格納されます。 Guru99.
  6. 文字列名の値をテキストとともにコンソールに出力します。
  7. プログラムが正常に実行される場合、main() 関数は値を返す必要があります。
  8. main() 関数の本体の終わり。

文字列関数 C++

多くの場合、文字列を操作したくなるでしょう。 C++ これには、使用できるさまざまな関数が用意されています。これらの関数は、ヘッダーファイルなので、関数を使用するにはコードに含める必要があります。いくつか例を挙げてみましょう。

strcpy()

これが文字列コピー関数です。 ある文字列を別の文字列にコピーします。

構文:

strcpy(string1, string2);

関数の引数であるstring1とstring2は、いずれも文字列です。この関数は、string2の文字列をstring1にコピーします。

strcat()

これが文字列連結関数です。 文字列を連結します。

構文:

strcat(string1, string2);

関数の2つの引数、string1とstring2は、連結する文字列です。上記の関数は、文字列string1の末尾に文字列string2を連結します。

strlen()

これは文字列長関数です。 引数として渡された文字列の長さを返します。

構文:

strlen(string1);

パラメータ string1 は、長さを決定する文字列の名前です。 上記の関数は、文字列 string1 の長さを返します。

strcmp()

これは文字列比較関数です。 文字列の比較に使用されます。

構文:

strcmp(string1, string2);

上記の関数は、文字列string1とstring2が同じ場合は0を返し、string1 < string2の場合は0未満を返し、string1 > string2の場合は0より大きい値を返します。

例:

次の例は、上記の文字列関数の使用方法を示しています。

#include <iostream>
#include <cstring>
using namespace std;
int main() {

	char name1[10] = "Guru99";
	char name2[10] = "John";
	char name3[10];

	int len;
	strcpy(name3, name1);
	cout << "strcpy( name3, name1) : " << name3 << endl;

	strcat(name1, name2);
	cout << "strcat( name1, name2): " << name1 << endl;

	len = strlen(name1);
	cout << "strlen(name1) : " << len << endl;
	return 0;
}

出力:

文字列関数 C++

コードのスクリーンショットは次のとおりです。

文字列関数 C++

Code 説明:

  1. コードに iostream ヘッダー ファイルを含めます。 これにより、コンソールからの読み取りとコンソールへの書き込みが可能になります。
  2. 標準を含むコード内のヘッダー。
  3. std 名前空間を含めて、そのクラスと関数を呼び出さずに使用できるようにします。
  4. プログラムのロジックを追加するmain()関数を呼び出します。{はmain()関数の本体の開始を示します。
  5. 10文字の文字列を宣言し、name1という名前を付けます。この文字列には値が格納されます。 Guru99.
  6. 10 文字の文字列を宣言し、name2 という名前を付けます。 文字列には値 John が格納されます。
  7. 10 文字の文字列を宣言し、それに name3 という名前を付けます。
  8. を宣言する 整数変数 レンという名前。
  9. 文字列 name1 を文字列 name3 にコピーします。
  10. 文字列 name3 の値といくつかのテキストをコンソールに出力します。 Guru99.
  11. 文字列 name2 を文字列 name1 の末尾に連結します。name1 の値は現在 Guru99ジョン。
  12. 文字列 name1 の値といくつかのテキストをコンソールに出力します。 Guru99ジョン。
  13. name1という名前の文字列の長さを決定し、その長さの値を変数lenに代入します。
  14. len変数の値を他のテキストと共にコンソールに出力します。
  15. プログラムが正常に実行される場合、main() 関数は値を返す必要があります。
  16. main() 関数の本体の終わり。

よくあるご質問

はい。AIアシスタントは、文字配列をstd::stringにリファクタリングしたり、関連関数を更新したり、安全性上の利点を説明したりすることができます。ただし、開発者は、エッジケース、バッファサイズ、意図した動作について変更内容をレビューする必要があります。

はい。AIツールは、具体的な例を生成し、strcpyとstrcatの動作を説明し、バッファオーバーフローのリスクを警告します。これにより理解は促進されますが、動作を確認するには、やはり自分でコードを実行するのが最善の方法です。

std::string はメモリを動的に管理し、連結や比較などの組み込み操作を提供します。C スタイルの文字列は、'\0' で終端される固定文字配列であり、手動でのメモリ管理が必要で、エラーが発生しやすくなります。

宛先配列が小さすぎると、バッファオーバーフローを引き起こす可能性があります。より安全な代替手段としては、strncpy、strncat、またはstd::string操作の使用が挙げられます。これらはメモリを自動的に管理し、これらのリスクを軽減します。