C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で大文字と小文字を区別せずに文字列を比較する方法


C++の標準ライブラリには、文字列を扱うためのstringクラスが用意されています。この記事では、2つの文字列が同一であるかどうかを大文字と小文字を区別せずに判定する方法を解説します。

ロジックは非常にシンプルです。まず、比較対象となる両方の文字列をすべて小文字(または大文字)に変換します。その後、変換済みの文字列同士を比較し、結果を返すだけです。

文字列を小文字に変換する際には、<algorithm>ヘッダで提供されているstd::transform関数を使用します。これにより、文字列内の各文字に対して::tolowerを適用できます。

入力と出力の例

入力: 2つの文字列 "Hello WORLD" と "heLLO worLD"
出力: Strings are same(文字列は同一)

アルゴリズム

ステップ1: 2つの文字列 str1 と str2 を受け取る
ステップ2: str1 と str2 を小文字形式に変換する
ステップ3: str1 と str2 を比較する
ステップ4: 終了

サンプルコード

#include<iostream>
#include <algorithm>
using namespace std;

int case_insensitive_match(string s1, string s2) {
    // s1とs2を小文字の文字列に変換する
    transform(s1.begin(), s1.end(), s1.begin(), ::tolower);
    transform(s2.begin(), s2.end(), s2.begin(), ::tolower);
    if(s1.compare(s2) == 0)
        return 1; // 文字列は同一
    return 0; // 一致しなかった場合
}

main() {
    string s1, s2;
    s1 = "Hello WORLD";
    s2 = "heLLO worLD";
    if(case_insensitive_match(s1, s2)) {
        cout << "Strings are same"; // 文字列は同一
    }else{
        cout << "Strings are not same"; // 文字列は異なる
    }
}

実行結果

Strings are same

補足ポイント

::tolowerはC言語由来の関数のため、ASCII範囲の英字については期待どおりに動作しますが、日本語などのマルチバイト文字は変換の対象外となります。また、大文字と小文字の変換がロケールに依存するケースでは、意図しない動作になる可能性もあります。国際化対応が必要なアプリケーションでは、ロケールを明示的に扱う手法や、Unicode対応のライブラリの利用を検討するとよいでしょう。

  1. C++で文字列sをtに変換するための最小変更回数を求める

    問題の概要 同じ長さを持つ2つの文字列 s と t があり、どちらも小文字の英字のみで構成されているとします。まず文字列 s を任意の順序に自由に並べ替え、その後、s を t と一致させるために必要な最小の文字置換回数を求めます。 例えば、入力が s = eccynue、t = science の場合、答えは 2 になります。これは、eccynue を yccence に並べ替えた後、先頭の y を s に、2番目の c を i に置き換えることで science に変換できるためです。 解決のためのアプローチ この問題の鍵となるのは、並べ替えによって一致させられる文字はできるだけ多く一致

  2. C++で2つの2進数文字列を加算するプログラムの書き方

    2つの2進数を表す文字列が与えられたとき、それらを加算した結果を求め、その結果を2進数の文字列として返すことを考えます。2進数とは、0か1のいずれかで表現される数値のことです。2進数同士を足し合わせる際には、以下のような2進数特有の加算ルールに従う必要があります。0+0 → 0 0+1 → 1 1+0 → 1 1+1 → 0(繰り上がり1)入力例str1 = {11}, str2 = {1}出力例100入力例str1 = {110}, str2 = {1}出力例111問題を解くためのアプローチ両方の文字列を末尾(最下位桁)から走査する対応する桁の2進数同士を加算する1と1を足した場合は、その桁