C++で文字列を比較する方法は、使用している文字列の型によって異なります。
主に使われる文字列の型は、std::string、std::string_view、C形式文字列の3種類です。
通常のC++プログラムでは、扱いやすく安全性も高いstd::stringを使用するのが基本です。
一方、既存のC言語向けAPIを利用する場合などは、const char*やchar配列を扱うこともあります。
文字列の型によって正しい比較方法が異なるため、それぞれの特徴を理解して使い分ける必要があります。
std::stringを比較演算子で比較する方法
std::string同士は、数値と同じように比較演算子を使用して比較できます。
主な比較演算子は次のとおりです。
| 演算子 | 意味 |
|---|---|
== | 2つの文字列が等しい |
!= | 2つの文字列が等しくない |
< | 左側の文字列が右側より前にある |
> | 左側の文字列が右側より後にある |
<= | 左側の文字列が右側以前にある |
>= | 左側の文字列が右側以後にある |
文字列が等しいか確認する
2つの文字列が完全に一致しているかを確認する場合は、==演算子を使用します。
#include <iostream>
#include <string>
int main()
{
std::string text1 = "apple";
std::string text2 = "apple";
if (text1 == text2)
{
std::cout << "同じ文字列です\n";
}
else
{
std::cout << "異なる文字列です\n";
}
return 0;
}
実行結果は次のとおりです。
同じ文字列です
std::stringでは、文字列の長さと各文字の内容が一致している場合に、==が真になります。
文字列が異なるか確認する
2つの文字列が一致していないことを確認する場合は、!=演算子を使用します。
#include <iostream>
#include <string>
int main()
{
std::string text1 = "apple";
std::string text2 = "orange";
if (text1 != text2)
{
std::cout << "異なる文字列です\n";
}
return 0;
}
この例では、"apple"と"orange"の内容が異なるため、条件式は真になります。
std::stringの大小を比較する方法
std::stringでは、<や>などの比較演算子を使って文字列の順序を比較できます。
文字列は先頭から順番に比較される
文字列の大小比較では、先頭の文字から順番に比較されます。
異なる文字が見つかった時点で、その文字の順序によって大小関係が決まります。
#include <iostream>
#include <string>
int main()
{
std::string text1 = "apple";
std::string text2 = "banana";
if (text1 < text2)
{
std::cout << text1 << "は" << text2 << "より前です\n";
}
return 0;
}
実行結果は次のとおりです。
appleはbananaより前です
先頭文字の'a'が'b'より前にあるため、"apple"は"banana"より小さいと判定されます。
共通部分が同じ場合は短い文字列が前になる
一方の文字列がもう一方の文字列の先頭部分と完全に一致している場合は、短い文字列のほうが前になります。
#include <iostream>
#include <string>
int main()
{
std::string text1 = "app";
std::string text2 = "apple";
if (text1 < text2)
{
std::cout << "appのほうが前です\n";
}
return 0;
}
"app"は"apple"の先頭部分と一致しており、先に文字列が終了するため、"app"のほうが小さいと判定されます。
辞書式順序は自然言語の辞書順とは異なる
std::stringの大小比較は、一般に辞書式比較と呼ばれます。
ただし、日本語の五十音順や英単語の自然な辞書順が自動的に適用されるわけではありません。
通常は、文字列を構成する文字コードやバイト列に基づいて比較されます。
そのため、言語に応じた自然な並べ替えが必要な場合は、ロケールやUnicodeの照合機能に対応したライブラリが必要です。
大文字と小文字を区別して比較する方法
C++の標準的な文字列比較では、大文字と小文字が区別されます。
#include <iostream>
#include <string>
int main()
{
std::string text1 = "Apple";
std::string text2 = "apple";
if (text1 == text2)
{
std::cout << "同じです\n";
}
else
{
std::cout << "異なります\n";
}
return 0;
}
実行結果は次のとおりです。
異なります
"Apple"と"apple"では、先頭の'A'と'a'が異なるため、一致しません。
また、大小比較でも大文字と小文字は区別されます。
compare関数で文字列を比較する方法
std::stringには、文字列を比較するためのcompare関数が用意されています。
基本的な書式は次のとおりです。
文字列1.compare(文字列2)
戻り値の意味は次のとおりです。
| 戻り値 | 意味 |
|---|---|
| 0より小さい | 呼び出し元の文字列が比較対象より前 |
| 0 | 2つの文字列が等しい |
| 0より大きい | 呼び出し元の文字列が比較対象より後 |
compare関数の基本的な使い方
#include <iostream>
#include <string>
int main()
{
std::string text1 = "apple";
std::string text2 = "banana";
int result = text1.compare(text2);
if (result == 0)
{
std::cout << "同じ文字列です\n";
}
else if (result < 0)
{
std::cout << "text1はtext2より前です\n";
}
else
{
std::cout << "text1はtext2より後です\n";
}
return 0;
}
この例では、"apple"が"banana"より前にあるため、compareは負の値を返します。
戻り値を-1や1と決めつけない
compareの戻り値は、必ずしも-1、0、1のいずれかになるとは限りません。
保証されているのは、戻り値が負、0、正のどれになるかという点だけです。
そのため、次のように0との大小関係で判定します。
if (result < 0)
{
// text1のほうが前
}
次のように特定の値だけを期待する書き方は避けるべきです。
if (result == -1)
{
// 推奨されない
}
compare関数をそのまま条件式にしない
compareは、文字列が一致した場合に0を返します。
C++では0は偽として扱われるため、次のコードは文字列が異なる場合に実行されます。
if (text1.compare(text2))
{
// text1とtext2が異なる場合に実行される
}
文字列が一致しているか確認する場合は、明示的に0と比較します。
if (text1.compare(text2) == 0)
{
// 文字列が一致している
}
完全一致を確認するだけであれば、==を使うほうが簡潔で分かりやすいでしょう。
文字列の一部分をcompare関数で比較する方法
compareでは、文字列全体だけでなく、一部分を指定して比較できます。
#include <iostream>
#include <string>
int main()
{
std::string text = "Hello, C++";
if (text.compare(0, 5, "Hello") == 0)
{
std::cout << "Helloで始まっています\n";
}
return 0;
}
compare(0, 5, "Hello")の引数は、次の意味を持ちます。
compare(開始位置, 比較する文字数, 比較対象)
この例では、textの0番目から5文字分を"Hello"と比較しています。
ただし、文字列の先頭や末尾だけを確認する場合は、C++20以降で利用できるstarts_withやends_withのほうが目的を明確に表現できます。
starts_withで文字列の先頭を比較する方法
C++20以降では、文字列が指定した文字列で始まっているかをstarts_withで確認できます。
#include <iostream>
#include <string>
int main()
{
std::string text = "Hello, C++";
if (text.starts_with("Hello"))
{
std::cout << "Helloで始まっています\n";
}
return 0;
}
starts_withは、条件に一致した場合にtrueを返します。
先頭の1文字を確認する
starts_withでは、文字列だけでなく1文字を指定することもできます。
std::string text = "Hello";
if (text.starts_with('H'))
{
std::cout << "Hで始まっています\n";
}
starts_withはC++20以降の機能であるため、利用する際はコンパイラの設定を確認する必要があります。
ends_withで文字列の末尾を比較する方法
C++20以降では、文字列が指定した文字列で終わっているかをends_withで確認できます。
#include <iostream>
#include <string>
int main()
{
std::string filename = "sample.txt";
if (filename.ends_with(".txt"))
{
std::cout << "テキストファイルです\n";
}
return 0;
}
ファイル名の拡張子やURLの末尾を確認する場合に便利です。
ただし、通常の文字列比較と同様に、大文字と小文字は区別されます。
そのため、"sample.TXT"は.ends_with(".txt")では一致しません。
containsで部分文字列を確認する方法
C++23以降では、文字列の中に特定の文字列が含まれているかをcontainsで確認できます。
#include <iostream>
#include <string>
int main()
{
std::string text = "Hello, C++";
if (text.contains("C++"))
{
std::cout << "C++が含まれています\n";
}
return 0;
}
containsは、文字列全体の一致を確認する関数ではありません。
指定した文字列が一部分として含まれているかを確認するための関数です。
find関数で部分文字列を検索する方法
C++23より前の環境では、find関数を使って部分文字列の有無を確認できます。
#include <iostream>
#include <string>
int main()
{
std::string text = "Hello, C++";
if (text.find("C++") != std::string::npos)
{
std::cout << "C++が含まれています\n";
}
return 0;
}
findは、指定した文字列が見つかった場合に、その開始位置を返します。
見つからなかった場合は、std::string::nposを返します。
そのため、部分文字列が存在するか確認する場合は、次のように記述します。
if (text.find("C++") != std::string::npos)
{
}
std::stringと文字列リテラルを比較する方法
std::stringと"apple"のような文字列リテラルは、==で内容を比較できます。
#include <iostream>
#include <string>
int main()
{
std::string text = "apple";
if (text == "apple")
{
std::cout << "一致しました\n";
}
return 0;
}
左右を入れ替えても比較できます。
if ("apple" == text)
{
std::cout << "一致しました\n";
}
一方がstd::stringで、もう一方が有効なヌル終端文字列であれば、文字列の内容を比較できます。
ただし、比較相手のconst char*がnullptrである場合は、安全に比較できません。
std::string text = "apple";
const char* ptr = nullptr;
// 未定義動作につながる可能性がある
if (text == ptr)
{
}
C形式文字列へのポインタを使用する場合は、有効なヌル終端文字列を指していることを確認する必要があります。
const char*を比較するときの注意点
const char*は文字列そのものではなく、文字列が格納されている場所を指すポインタです。
そのため、const char*同士を==で比較すると、文字列の内容ではなく、常にポインタの値が比較されます。
const char*を==で比較するとアドレス比較になる
#include <iostream>
int main()
{
const char* text1 = "apple";
const char* text2 = "apple";
if (text1 == text2)
{
std::cout << "同じアドレスです\n";
}
return 0;
}
この比較で真になる場合があっても、文字列の内容が正しく比較されたことにはなりません。
コンパイラが同じ文字列リテラルを同一の領域に格納した場合などに、偶然同じアドレスになることがあります。
文字列の内容を比較する場合は、std::strcmpを使用します。
strcmp関数でC形式文字列を比較する方法
C形式文字列を比較する場合は、<cstring>に定義されているstd::strcmpを使用します。
#include <cstring>
#include <iostream>
int main()
{
const char* text1 = "apple";
const char* text2 = "apple";
if (std::strcmp(text1, text2) == 0)
{
std::cout << "同じ文字列です\n";
}
return 0;
}
std::strcmpの戻り値は次のとおりです。
| 戻り値 | 意味 |
|---|---|
| 0より小さい | 第1引数が第2引数より前 |
| 0 | 2つの文字列が等しい |
| 0より大きい | 第1引数が第2引数より後 |
strcmpでも戻り値の符号を確認する
std::strcmpの戻り値も、必ず-1、0、1になるわけではありません。
次のように0との大小関係で判定します。
int result = std::strcmp(text1, text2);
if (result < 0)
{
std::cout << "text1のほうが前です\n";
}
else if (result == 0)
{
std::cout << "同じです\n";
}
else
{
std::cout << "text1のほうが後です\n";
}
strcmpには有効なヌル終端文字列を渡す
std::strcmpには、正しくヌル終端された有効なC形式文字列を渡す必要があります。
nullptr、無効なポインタ、ヌル終端されていない文字配列などを渡すと、未定義動作になります。
const char* text = nullptr;
// 未定義動作
std::strcmp(text, "apple");
ポインタがnullptrになる可能性がある場合は、事前に確認します。
if (text != nullptr && std::strcmp(text, "apple") == 0)
{
std::cout << "一致しました\n";
}
ただし、nullptrでないことだけでは、有効な文字列を指している保証にはなりません。
ポインタの参照先が正しく確保され、ヌル終端されている必要があります。
char配列を比較する方法
char配列も、配列名を==で比較して文字列の内容を確認することはできません。
char text1[] = "apple";
char text2[] = "apple";
if (text1 == text2)
{
// 文字列の内容を比較しているわけではない
}
通常の式では、配列名は先頭要素へのポインタとして扱われます。
そのため、上記の比較では異なる配列の先頭アドレスが比較されます。
内容を比較する場合は、std::strcmpを使用します。
#include <cstring>
#include <iostream>
int main()
{
char text1[] = "apple";
char text2[] = "apple";
if (std::strcmp(text1, text2) == 0)
{
std::cout << "同じ文字列です\n";
}
return 0;
}
char配列はヌル終端する必要がある
C形式文字列として扱うchar配列には、文字列の終端を表すヌル文字\0が必要です。
次の配列はヌル終端されていません。
char text[3] = {'a', 'b', 'c'};
この配列をstd::strcmpに渡すと、配列の範囲外まで読み取る可能性があります。
正しくは、終端用の領域を確保します。
char text[4] = {'a', 'b', 'c', '\0'};
または、文字列リテラルで初期化します。
char text[] = "abc";
文字列リテラルで初期化した場合は、末尾の\0も自動的に格納されます。
std::string_viewで文字列を比較する方法
C++17以降では、文字列を参照するためのstd::string_viewを利用できます。
std::string_viewも、==や<などの比較演算子を使用できます。
#include <iostream>
#include <string_view>
int main()
{
std::string_view text1 = "apple";
std::string_view text2 = "apple";
if (text1 == text2)
{
std::cout << "同じ文字列です\n";
}
return 0;
}
std::string_viewは文字列データを所有せず、既存の文字列を参照します。
文字列をコピーせずに比較できるため、関数の引数などで便利です。
#include <iostream>
#include <string_view>
bool isApple(std::string_view text)
{
return text == "apple";
}
int main()
{
if (isApple("apple"))
{
std::cout << "appleです\n";
}
return 0;
}
string_viewでは参照元の寿命に注意する
std::string_viewは文字列を所有しないため、参照元の文字列より長く使用してはいけません。
#include <string>
#include <string_view>
std::string_view createView()
{
std::string text = "apple";
return text;
}
この関数が返すstd::string_viewは、関数終了時に破棄されたtextのデータを参照しています。
返されたビューを使用すると、未定義動作につながる可能性があります。
また、参照元のstd::stringが変更され、内部領域が再確保された場合も、std::string_viewが無効になることがあります。
大文字と小文字を区別せずに比較する方法
標準のstd::stringには、大文字と小文字を無視して比較するための単純な専用関数はありません。
ASCII英字を対象とする簡易的な方法として、両方の文字列を小文字に変換してから比較する方法があります。
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
#include <string_view>
std::string toLower(std::string_view text)
{
std::string result(text);
std::transform(
result.begin(),
result.end(),
result.begin(),
[](unsigned char c)
{
return static_cast<char>(std::tolower(c));
}
);
return result;
}
int main()
{
std::string text1 = "Apple";
std::string text2 = "apple";
if (toLower(text1) == toLower(text2))
{
std::cout << "大文字と小文字を無視すると同じです\n";
}
return 0;
}
tolowerにはunsigned charとして渡す
std::tolowerに負の値を持つcharを直接渡すと、未定義動作になる可能性があります。
そのため、次のようにunsigned charとして受け取る書き方が安全です。
[](unsigned char c)
{
return static_cast<char>(std::tolower(c));
}
Unicode文字列には単純なtolowerでは不十分
この方法は、主にASCII英字を対象とする簡易的な処理です。
UTF-8では、1つの文字が複数のバイトで表現されることがあります。
そのため、std::stringを1バイトずつstd::tolowerに渡しても、Unicodeにおける正しい大文字・小文字変換にはなりません。
多言語の文字列を正確に比較する場合は、ICUなどのUnicode対応ライブラリを検討する必要があります。
数字を含む文字列を比較するときの注意点
数字が書かれた文字列を比較しても、数値としての大小比較にはなりません。
文字列として先頭から比較されます。
#include <iostream>
#include <string>
int main()
{
std::string text1 = "10";
std::string text2 = "2";
if (text1 < text2)
{
std::cout << "文字列としては10が2より前です\n";
}
return 0;
}
文字列比較では、先頭の'1'と'2'が比較されます。
'1'は'2'より前にあるため、文字列としては"10" < "2"が真になります。
数値として比較する場合は変換する
数値として大小を比較したい場合は、整数や浮動小数点数に変換します。
#include <iostream>
#include <string>
int main()
{
std::string text1 = "10";
std::string text2 = "2";
int number1 = std::stoi(text1);
int number2 = std::stoi(text2);
if (number1 > number2)
{
std::cout << "数値としては10のほうが大きいです\n";
}
return 0;
}
stoiは文字列全体を変換するとは限らない
std::stoiは、文字列の先頭部分を数値に変換できれば、後ろに文字が残っていても成功する場合があります。
int value = std::stoi("123abc");
この場合、先頭の123が整数として変換されます。
文字列全体が整数として正しいか確認する場合は、第2引数で変換済みの位置を受け取ります。
#include <iostream>
#include <stdexcept>
#include <string>
int main()
{
std::string text = "123abc";
std::size_t pos = 0;
try
{
int value = std::stoi(text, &pos);
if (pos == text.size())
{
std::cout << "文字列全体を変換できました\n";
}
else
{
std::cout << "変換されていない文字が残っています\n";
}
}
catch (const std::invalid_argument&)
{
std::cout << "整数に変換できません\n";
}
catch (const std::out_of_range&)
{
std::cout << "整数の範囲を超えています\n";
}
return 0;
}
std::stoiは、変換できる数値がない場合にstd::invalid_argumentを送出します。
変換結果がintの範囲を超える場合は、std::out_of_rangeを送出します。
日本語の文字列を比較する方法
UTF-8で保存された日本語文字列も、std::stringの==で完全一致を確認できます。
#include <iostream>
#include <string>
int main()
{
std::string text1 = "こんにちは";
std::string text2 = "こんにちは";
if (text1 == text2)
{
std::cout << "同じ文字列です\n";
}
return 0;
}
この場合は、2つの文字列のバイト列が一致しているため、等しいと判定されます。
std::stringはUnicode文字を理解して比較するわけではない
std::stringは、Unicodeの文字や意味を理解して比較しているわけではありません。
内部に格納されているバイト列を比較しています。
そのため、見た目が同じ文字列でも、Unicode上の表現が異なれば一致しない場合があります。
たとえば、アクセント付き文字などでは、1つの文字として表現される場合と、基本文字と結合文字の組み合わせで表現される場合があります。
見た目が同じでもバイト列が異なれば、==では一致しません。
日本語の五十音順にはならない
std::stringを<や>で比較しても、日本語の五十音順になるとは限りません。
日本語として自然な並べ替えを行う場合は、Unicodeの照合規則に対応したライブラリが必要です。
std::stringに含まれるヌル文字を比較する方法
std::stringは、文字列の長さを内部で保持しています。
そのため、文字列の途中にヌル文字\0を含めることができます。
#include <iostream>
#include <string>
int main()
{
std::string text1{"ab\0cd", 5};
std::string text2{"ab\0cd", 5};
if (text1 == text2)
{
std::cout << "同じ文字列です\n";
}
return 0;
}
std::string同士の比較では、途中の\0より後ろにある文字も含めて比較されます。
strcmpは最初のヌル文字までしか比較しない
std::strcmpは、最初の\0を文字列の終端として扱います。
#include <cstring>
#include <iostream>
#include <string>
int main()
{
std::string text1{"ab\0cd", 5};
std::string text2{"ab\0xy", 5};
bool stringResult = text1 == text2;
bool strcmpResult =
std::strcmp(text1.c_str(), text2.c_str()) == 0;
std::cout << std::boolalpha;
std::cout << stringResult << '\n';
std::cout << strcmpResult << '\n';
return 0;
}
std::stringによる比較では、\0より後ろの"cd"と"xy"も比較されるため、結果はfalseです。
一方、std::strcmpでは最初の\0までしか比較されないため、両方とも"ab"として扱われ、結果はtrueになります。
バイナリデータや途中にヌル文字を含む文字列を扱う場合は、std::strcmpではなくstd::stringの比較を使用する必要があります。
C++20の三方比較演算子を使う方法
C++20では、三方比較演算子<=>が導入されました。
std::string同士の比較にも使用できます。
#include <compare>
#include <iostream>
#include <string>
int main()
{
std::string text1 = "apple";
std::string text2 = "banana";
auto result = text1 <=> text2;
if (result < 0)
{
std::cout << "text1はtext2より前です\n";
}
else if (result == 0)
{
std::cout << "同じ文字列です\n";
}
else
{
std::cout << "text1はtext2より後です\n";
}
return 0;
}
三方比較演算子を使うと、1回の比較で前、同じ、後の3通りを判定できます。
ただし、完全一致だけを確認する場合は==、前後関係だけを確認する場合は<や>のほうが簡潔です。
文字列を並べ替える方法
std::stringの比較演算子は、文字列を並べ替える場合にも使用されます。
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<std::string> words = {
"orange",
"apple",
"banana"
};
std::sort(words.begin(), words.end());
for (const std::string& word : words)
{
std::cout << word << '\n';
}
return 0;
}
実行結果は次のとおりです。
apple
banana
orange
std::sortは、デフォルトではstd::stringの<演算子を使って並べ替えます。
ただし、大文字と小文字を区別しない並べ替えや、日本語の五十音順などを実現したい場合は、独自の比較関数が必要です。
文字列比較でよくある間違い
const char*を==で内容比較する
次のコードは、文字列の内容ではなくポインタの値を比較します。
const char* text1 = "apple";
const char* text2 = "apple";
if (text1 == text2)
{
// 内容比較ではない
}
内容を比較する場合は、std::strcmpを使用します。
if (std::strcmp(text1, text2) == 0)
{
// 内容が一致
}
または、std::stringとして比較します。
if (std::string(text1) == text2)
{
// 内容が一致
}
compareの戻り値をboolとして扱う
compareは、一致した場合に0を返します。
if (text1.compare(text2))
{
// 文字列が異なる場合に実行される
}
一致を確認する場合は、0と比較します。
if (text1.compare(text2) == 0)
{
// 文字列が一致
}
strcmpにnullptrを渡す
std::strcmpにnullptrを渡すと未定義動作になります。
const char* text = nullptr;
std::strcmp(text, "apple");
ポインタが有効であることを確認してから使用する必要があります。
ヌル終端されていない配列をstrcmpに渡す
次の配列は、末尾に\0を持っていません。
char text[3] = {'a', 'b', 'c'};
この配列をstd::strcmpに渡してはいけません。
正しくは、ヌル文字を格納する領域を用意します。
char text[4] = {'a', 'b', 'c', '\0'};
数字の文字列を数値として比較する
次の比較は、数値比較ではなく文字列比較です。
std::string text1 = "10";
std::string text2 = "2";
bool result = text1 < text2;
数値として比較したい場合は、数値型に変換する必要があります。
C++のバージョンごとに使える機能
文字列比較に関連する主な機能と、対応するC++規格は次のとおりです。
| 機能 | 対応規格 |
|---|---|
std::string_view | C++17以降 |
std::string::starts_with | C++20以降 |
std::string::ends_with | C++20以降 |
三方比較演算子<=> | C++20以降 |
std::string::contains | C++23以降 |
コンパイラが対応していても、コンパイルオプションで対象規格を指定しなければ利用できない場合があります。
GCCやClangでC++20を指定する例は次のとおりです。
g++ -std=c++20 main.cpp
C++23を指定する例は次のとおりです。
g++ -std=c++23 main.cpp
用途別におすすめの文字列比較方法
完全一致を確認する場合
std::stringでは、==を使用するのが最も分かりやすい方法です。
if (text1 == text2)
{
}
一致しないことを確認する場合
!=を使用します。
if (text1 != text2)
{
}
文字列の前後関係を確認する場合
<や>を使用します。
if (text1 < text2)
{
}
比較結果を3通りに分ける場合
compareまたはC++20以降の<=>を使用できます。
int result = text1.compare(text2);
if (result < 0)
{
}
else if (result == 0)
{
}
else
{
}
C形式文字列を比較する場合
std::strcmpを使用します。
if (std::strcmp(text1, text2) == 0)
{
}
文字列の先頭を確認する場合
C++20以降では、starts_withを使用します。
if (text.starts_with("https://"))
{
}
文字列の末尾を確認する場合
C++20以降では、ends_withを使用します。
if (filename.ends_with(".txt"))
{
}
部分文字列が含まれているか確認する場合
C++23以降では、containsを使用します。
if (text.contains("C++"))
{
}
C++23より前では、findを使用します。
if (text.find("C++") != std::string::npos)
{
}
まとめ
C++で文字列を比較する場合は、文字列の型と比較の目的に合わせて方法を選ぶ必要があります。
std::string同士の完全一致を確認する場合は、==を使用するのが最も簡単です。
文字列が異なるか確認する場合は!=、前後関係を確認する場合は<や>を使用できます。
比較結果を負、0、正の3通りに分けたい場合は、compareが便利です。
C++20以降では、文字列の先頭を確認するstarts_withと、末尾を確認するends_withが利用できます。
C++23以降では、部分文字列の有無を確認するcontainsが利用できます。
一方、const char*やchar配列などのC形式文字列は、==で内容を比較できません。
C形式文字列の内容を比較する場合は、std::strcmpを使用します。
ただし、std::strcmpには、有効で正しくヌル終端された文字列を渡す必要があります。
新しくC++のコードを書く場合は、特別な理由がない限り、C形式文字列よりもstd::stringやstd::string_viewを利用することで、安全で読みやすいコードにしやすくなります。
以上、C++で文字列を比較する方法についてでした。
最後までお読みいただき、ありがとうございました。
