3

重複の可能性:
C++での大文字と小文字を区別しない文字列の比較

2つの文字列が等しいかどうかを比較するために、C++用のコードをいくつか作成しました。私が欲しいのは校正です。将来的にはもっと多くのプログラムでこれを使うことを計画しているので、この関数がうまく機能することが重要です。この機能は、再利用可能、ポータブルなどの機能のように見えますか?これを行うためのより「最新の」方法はありますか?私はacライブラリを使用しましたが、これはc ++プログラムです、それはタブーですか?

ありがとう、JH。

//function to compare two strings regardless of case 
//-- returns true if the two strings are equal
//-- returns false if
//  --the strings are unequal
//  --one of the strings is longer than 255 chars
bool isEqual(string str1, string str2){

  if(str1.length()!=str2.length())  //the strings are different lengths,
    return false;               //they can't be equal
  if((str1.length()>255) || (str2.length()>255))
    return false;

  char * cstr1 = new char [str1.length()+1];
  strcpy (cstr1, str1.c_str());
  char * cstr2 = new char [str2.length()+1];
  strcpy (cstr2, str2.c_str());

  for(int i=0; i<str1.length()+1; i++){
    if(toupper(cstr1[i]) != toupper(cstr2[i]))
      return false;
  }

  return true;
}
4

2 に答える 2

20

関数の名前をisEqual_CaseInsensitiveに変更するか、関数の機能と一致する名前にする必要があります。コピーを避けるために、参照によって文字列を渡す必要があります。文字列を比較するために文字列のコピーを作成する必要はありません。

    bool isEqual_CaseInsensitive(const string& a, const string& b)
    {
            return a.size() == b.size() &&
                std::equal(a.begin(), a.end(), b.begin(), [](char cA, char cB) {
                        return toupper(cA) == toupper(cB);
                   });
    }
于 2012-09-24T15:47:11.607 に答える
2

この関数は、次の点を除いて非常に見栄えがします。

これらのc文字列への変換は必要ありません。

  char * cstr1 = new char [str1.length()+1];
  strcpy (cstr1, str1.c_str());
  char * cstr2 = new char [str2.length()+1];
  strcpy (cstr2, str2.c_str());

c文字列のようにstd::string文字にアクセスできるため:

  for(int i=0; i<str1.length(); i++){
    if(toupper(str1[i]) != toupper(str2[i]))
      return false;
  }

+1また、私が削除したことに注意してくださいi<str1.length() + 1...

他の方法については、こちらを参照してください:C++での大文字と小文字を区別しない文字列の比較

于 2012-09-24T15:49:03.527 に答える