C++で大文字と小文字を無視する独自のstrcmp関数を作成する方法
ここでは、2つの文字列を比較する際に大文字と小文字の違いを無視するstrcmp(文字列比較)関数を独自に作成します。この関数は、string1 < string2 の場合は -1、string1 = string2 の場合は 0、string1 > string2 の場合は 1 を返します。
まず、具体例で問題を確認しましょう。
入力
string1 = "Hello" , string2 = "hello"
出力
0
アルゴリズムの考え方
大文字小文字を無視して文字列を比較する独自のstrcmp関数を作るには、両方の文字列の文字を先頭から順に走査していきます。
- i番目の文字が同じ場合(string1[i] == string2[i])は、次の文字へ進みます。
- string1[i] > string2[i] の場合は 1 を返します。
- string1[i] < string2[i] の場合は -1 を返します。
- 文字列の末尾に達した場合は 0 を返します。
ここでは大文字と小文字を区別しないため、「A」と「a」は同じ文字として扱います。これを実現するために、文字のASCII値を利用します。ASCIIコードでは「a」は97、「A」は65であり、両者の差は32です。したがって、32とのXOR(排他的論理和)を取ることで、英字の大文字と小文字を相互に変換できます。この性質を利用すれば、大文字小文字の違いを吸収した比較が可能になります。
実装例
#include <iostream>
using namespace std;
int strcmpFunc(string string1, string string2){
int i;
for (i = 0; string1[i] && string2[i]; ++i){
if (string1[i] == string2[i] || (string1[i] ^ 32) == string2[i])
continue;
else
break;
}
if (string1[i] == string2[i])
return 0;
if ((string1[i] | 32) < (string2[i] | 32))
return -1;
return 1;
}
int main(){
cout<<"独自のstrcmp関数で文字列を比較 :\n";
cout<<"Result: "<<strcmpFunc("HELLO", "hello")<<endl;
cout<<"Result: "<<strcmpFunc("", "Hello")<<endl;
cout<<"Result: "<<strcmpFunc("Tutorials", "Pint")<<endl;
cout<<"Result: "<<strcmpFunc("afdadsa", "rewf")<<endl;
cout<<"Result: "<<strcmpFunc("tutorialspoint", "TUTORIALSpoint")<<endl;
return 0;
}出力
独自のstrcmp関数で文字列を比較 − Result: 0 Result: -1 Result: 1 Result: -1 Result: 0
コードの解説
この実装のポイントは、(string1[i] ^ 32) == string2[i] という条件です。英字の場合、大文字と小文字はASCIIコード上で32だけ異なるため、XOR演算によって大文字小文字の違いを無視した等価判定ができます。
また、最終的な大小の判定では | 32(ビットOR)を使って両方の文字を小文字に正規化してから比較しており、これによりどちらのケースで入力されても正しい結果が得られます。
このように、標準ライブラリの strcmp に頼らず、ビット演算を活用することで、大文字小文字を区別しない文字列比較関数をシンプルかつ効率的に実装できます。
-
C/C++で独自のsizeof演算子を自作する方法|#defineマクロとポインタ演算の活用
独自のsizeof()演算子とは?C言語やC++では、標準のsizeof()演算子に頼らず、自分専用のsizeof()演算子を自作することも可能です。sizeof()は単項演算子の一種で、変数やデータ型がメモリ上で占めるサイズ(バイト数)を計算するために使われます。#defineディレクティブ(関数形式マクロ)を利用すれば、標準のsizeof()とまったく同じように動作する独自のsizeof()を実装できます。実装の仕組みこのテクニックの鍵となるのはポインタ演算です。あるオブジェクトのアドレスに1を加えると、ポインタは「その型1つ分」だけ前進します。そこで、元のアドレスと1つ先のアドレスをそれ
-
C/C++におけるstrncmp()とstrcmp()の違いを徹底解説
strncmp()とはstrncmp()は、指定された文字数まで左側の文字列と右側の文字列を比較するための関数です。基本的な動作はstrcmp()と同じですが、「比較する最大文字数」を引数で指定できる点が大きな特徴です。戻り値は以下のように決まります。比較した位置の文字同士がすべて等しい場合(または指定文字数内で差が出なかった場合):0左側の文字列の文字が、右側の対応する文字より大きいASCII値を持つ場合:0より大きい値左側の文字列の文字が、右側の対応する文字より小さいASCII値を持つ場合:0より小さい値C言語におけるstrncmp()の構文は次のとおりです。int strncmp(con