3

この質問は非常に簡単かもしれませんが、私は c++ の経験がなく、単純なパーサーを作成しているときに行き詰まりました。何らかの理由で、文字列比較関数の 1 つが呼び出されたときに期待値を返さないことがありました。関数は次のようになります。

template<int length>
bool Parser::compare(const char *begin, const char *str){
   int i = 0;
   while(i != length && compareCaseInsensitive(*begin, *str)){
      i++;
      begin++;
      str++;
   }
   return i == length;
 };

この関数の目的は、ランタイム文字バッファーをコンパイル時の定数文字列 vb と比較することでした。

compare<4>(currentByte, "<!--");

固定長の文字バッファーを比較するより効率的な方法があることは知っていますが (後でそれを使用しました)、この関数を実行するとかなり戸惑い、2 つの同一の文字列であっても常に false を返します。

デバッガーで確認し、ループの最後で i の値を確認したところ、テンプレート パラメーターの値と同じでしたが、return 式は false と評価されました。int テンプレート パラメーターの操作に関する特別なルールはありますか? テンプレート パラメーターはコンパイル時定数のように動作すると想定しました。

これが関連しているかどうかはわかりませんが、gcc の g++ コンパイラを実行し、gdb でデバッグしています。

誰かがこの問題の原因を教えてくれれば、非常にありがたいです。

このコードで使用される関数:

template<typename Character>
Character toLowerCase(Character c){
    return c > 64 && c < 91 ? c | 0x10 : c;
};

template<typename Character>
bool equalsCaseInsensitive(Character a, Character b){
    return toLowerCase(a) == toLowerCase(b);
};
4

1 に答える 1

0

大文字と小文字を区別しない文字列比較を行うには、署名のあるヘッダーからSTL 関数std::strcollを使用してみます<cstring>

int strcoll( const char* lhs, const char* rhs );

現在のロケールに従って、ヌルで終わる 2 つのバイト文字列を比較します。または、自分でロールしたい場合は、署名のあるヘッダーからstd::tolowerを使用できます<cctype>

int tolower( int ch );

現在インストールされている C ロケールで定義されている文字変換規則に従って、指定された文字を小文字に変換します。

于 2013-01-19T09:47:11.067 に答える