[C++] char*文字列を比較する方法をわかりやすく解説
C++でchar*
文字列を比較する場合、==
演算子ではポインタのアドレスを比較するため、文字列の内容を比較するには標準ライブラリ関数strcmp
を使用します。
strcmp
は2つの文字列を比較し、等しい場合は0、異なる場合は正または負の値を返します。
例として、strcmp(str1, str2) == 0
で内容が等しいかを判定できます。
char*文字列の比較方法
C++において、char*
型の文字列を比較する方法はいくつかあります。
ここでは、主にstrcmp
関数を使用した比較方法と、手動での比較方法について解説します。
strcmp関数を使用した比較
strcmp
関数は、2つの文字列を比較し、その結果を整数で返します。
具体的には、以下のように動作します。
- 0より小さい値が返される場合、最初の文字列が2番目の文字列よりも小さい。
- 0が返される場合、2つの文字列は等しい。
- 0より大きい値が返される場合、最初の文字列が2番目の文字列よりも大きい。
以下は、strcmp
関数を使用したサンプルコードです。
#include <iostream>
#include <cstring> // strcmp関数を使用するために必要
int main() {
const char* str1 = "こんにちは"; // 比較する文字列1
const char* str2 = "こんにちは"; // 比較する文字列2
const char* str3 = "さようなら"; // 比較する文字列3
// str1とstr2を比較
if (strcmp(str1, str2) == 0) {
std::cout << "str1とstr2は等しいです。" << std::endl; // 等しい場合の出力
} else {
std::cout << "str1とstr2は異なります。" << std::endl; // 異なる場合の出力
}
// str1とstr3を比較
if (strcmp(str1, str3) == 0) {
std::cout << "str1とstr3は等しいです。" << std::endl; // 等しい場合の出力
} else {
std::cout << "str1とstr3は異なります。" << std::endl; // 異なる場合の出力
}
return 0;
}
str1とstr2は等しいです。
str1とstr3は異なります。
手動での比較
char*
型の文字列を手動で比較することも可能です。
これは、各文字を1つずつ比較する方法です。
以下はそのサンプルコードです。
#include <iostream>
bool compareStrings(const char* str1, const char* str2) {
while (*str1 && (*str1 == *str2)) { // 文字が等しい限りループ
str1++; // 次の文字へ
str2++; // 次の文字へ
}
return (*str1 == *str2); // 最後の文字も比較
}
int main() {
const char* str1 = "こんにちは"; // 比較する文字列1
const char* str2 = "こんにちは"; // 比較する文字列2
const char* str3 = "さようなら"; // 比較する文字列3
// str1とstr2を比較
if (compareStrings(str1, str2)) {
std::cout << "str1とstr2は等しいです。" << std::endl; // 等しい場合の出力
} else {
std::cout << "str1とstr2は異なります。" << std::endl; // 異なる場合の出力
}
// str1とstr3を比較
if (compareStrings(str1, str3)) {
std::cout << "str1とstr3は等しいです。" << std::endl; // 等しい場合の出力
} else {
std::cout << "str1とstr3は異なります。" << std::endl; // 異なる場合の出力
}
return 0;
}
str1とstr2は等しいです。
str1とstr3は異なります。
strcmp
関数を使用することで、簡単に文字列を比較できます。- 手動での比較は、より細かい制御が可能ですが、実装が少し複雑になります。
このように、C++ではchar*
型の文字列を比較する方法がいくつかあり、用途に応じて使い分けることができます。
char*文字列比較の応用
char*
型の文字列比較は、さまざまな場面で活用されます。
ここでは、文字列のソート、検索、条件分岐など、具体的な応用例をいくつか紹介します。
文字列のソート
文字列を比較することで、配列内の文字列をソートすることができます。
以下は、strcmp
関数を使用して文字列の配列をソートするサンプルコードです。
#include <iostream>
#include <cstring> // strcmp関数を使用するために必要
#include <algorithm> // std::sortを使用するために必要
int main() {
const char* arr[] = {"バナナ", "りんご", "みかん", "さくらんぼ"}; // 文字列の配列
int n = sizeof(arr) / sizeof(arr[0]); // 配列の要素数
// 文字列のソート
std::sort(arr, arr + n, [](const char* a, const char* b) {
return strcmp(a, b) < 0; // strcmpを使用して比較
});
// ソート結果の出力
for (int i = 0; i < n; i++) {
std::cout << arr[i] << std::endl; // ソートされた文字列を出力
}
return 0;
}
さくらんぼ
りんご
みかん
バナナ
文字列の検索
文字列比較を利用して、特定の文字列が配列内に存在するかどうかを確認することもできます。
以下は、文字列の検索を行うサンプルコードです。
#include <iostream>
#include <cstring> // strcmp関数を使用するために必要
bool containsString(const char* arr[], int size, const char* target) {
for (int i = 0; i < size; i++) {
if (strcmp(arr[i], target) == 0) { // 文字列を比較
return true; // 見つかった場合
}
}
return false; // 見つからなかった場合
}
int main() {
const char* arr[] = {"バナナ", "りんご", "みかん", "さくらんぼ"}; // 文字列の配列
const char* target = "りんご"; // 検索する文字列
int n = sizeof(arr) / sizeof(arr[0]); // 配列の要素数
// 文字列の検索
if (containsString(arr, n, target)) {
std::cout << target << "は配列に存在します。" << std::endl; // 存在する場合
} else {
std::cout << target << "は配列に存在しません。" << std::endl; // 存在しない場合
}
return 0;
}
りんごは配列に存在します。
条件分岐での利用
文字列比較は、条件分岐においても重要な役割を果たします。
例えば、ユーザーからの入力に基づいて異なる処理を行う場合などです。
以下はそのサンプルコードです。
#include <iostream>
#include <cstring> // strcmp関数を使用するために必要
int main() {
const char* input; // ユーザー入力用の文字列
char buffer[100]; // 入力バッファ
std::cout << "コマンドを入力してください(exitで終了): ";
std::cin >> buffer; // ユーザーからの入力を受け取る
input = buffer; // 入力をchar*型に代入
// 入力に基づく条件分岐
if (strcmp(input, "exit") == 0) {
std::cout << "プログラムを終了します。" << std::endl; // exitの場合
} else {
std::cout << "入力されたコマンド: " << input << std::endl; // その他のコマンド
}
return 0;
}
コマンドを入力してください(exitで終了): hello
入力されたコマンド: hello
- 文字列のソートや検索に
char*
型の文字列比較が利用されます。 - 条件分岐においても、ユーザーの入力に基づく処理を行う際に役立ちます。
- これらの応用により、プログラムの柔軟性と機能性が向上します。
char*文字列比較の代替手段
C++では、char*
型の文字列比較にstrcmp
関数や手動比較の他にも、さまざまな代替手段があります。
ここでは、std::string
を使用した比較や、strncmp
関数、std::equal
アルゴリズムについて解説します。
std::stringを使用した比較
C++の標準ライブラリには、std::string
という文字列クラスが用意されています。
std::string
を使用することで、文字列の比較がより簡単かつ安全に行えます。
以下は、std::string
を使用した比較のサンプルコードです。
#include <iostream>
#include <string> // std::stringを使用するために必要
int main() {
std::string str1 = "こんにちは"; // 比較する文字列1
std::string str2 = "こんにちは"; // 比較する文字列2
std::string str3 = "さようなら"; // 比較する文字列3
// str1とstr2を比較
if (str1 == str2) {
std::cout << "str1とstr2は等しいです。" << std::endl; // 等しい場合の出力
} else {
std::cout << "str1とstr2は異なります。" << std::endl; // 異なる場合の出力
}
// str1とstr3を比較
if (str1 == str3) {
std::cout << "str1とstr3は等しいです。" << std::endl; // 等しい場合の出力
} else {
std::cout << "str1とstr3は異なります。" << std::endl; // 異なる場合の出力
}
return 0;
}
str1とstr2は等しいです。
str1とstr3は異なります。
strncmp関数を使用した比較
strncmp
関数は、指定した文字数だけを比較することができる関数です。
これにより、部分的な比較が可能になります。
以下は、strncmp
関数を使用したサンプルコードです。
#include <iostream>
#include <cstring> // strncmp関数を使用するために必要
int main() {
const char* str1 = "こんにちは"; // 比較する文字列1
const char* str2 = "こんにち"; // 比較する文字列2
// 最初の3文字を比較
if (strncmp(str1, str2, 3) == 0) {
std::cout << "str1とstr2の最初の3文字は等しいです。" << std::endl; // 等しい場合の出力
} else {
std::cout << "str1とstr2の最初の3文字は異なります。" << std::endl; // 異なる場合の出力
}
return 0;
}
str1とstr2の最初の3文字は等しいです。
std::equalアルゴリズムを使用した比較
C++の標準ライブラリには、std::equal
というアルゴリズムがあり、これを使用して2つの文字列を比較することもできます。
以下は、std::equal
を使用したサンプルコードです。
#include <iostream>
#include <cstring> // strcmp関数を使用するために必要
#include <algorithm> // std::equalを使用するために必要
int main() {
const char* str1 = "こんにちは"; // 比較する文字列1
const char* str2 = "こんにちは"; // 比較する文字列2
// std::equalを使用して比較
if (std::equal(str1, str1 + strlen(str1), str2)) {
std::cout << "str1とstr2は等しいです。" << std::endl; // 等しい場合の出力
} else {
std::cout << "str1とstr2は異なります。" << std::endl; // 異なる場合の出力
}
return 0;
}
str1とstr2は等しいです。
std::string
を使用することで、より簡単に文字列を比較できます。strncmp
関数を使うことで、部分的な文字列比較が可能です。std::equal
アルゴリズムを利用することで、イテレータを使った柔軟な比較が実現できます。
これらの代替手段を活用することで、char*
型の文字列比較をより効率的かつ安全に行うことができます。
まとめ
この記事では、C++におけるchar*
型の文字列比較方法について、strcmp
関数や手動比較、さらにはstd::string
やstrncmp
、std::equal
といった代替手段を紹介しました。
これらの手法を使うことで、文字列の比較がより効率的かつ安全に行えることがわかりました。
今後は、これらの比較方法を活用して、プログラムの柔軟性を高めることを検討してみてください。