フォーラム

Mac C ++文字列クラス-大文字と小文字を区別しない比較?

NS

溶ける

オリジナルポスター
2006年12月4日
テキサス州ケイティ
  • 2007年6月8日
オンラインリファレンス(cppreference.com)とC ++の本を調べましたが、文字列に依存しないcompare()が見つかりません。確かにC-Stringの大文字と小文字を区別しない比較がありますが、ある場合はC ++比較を使用したいと思います。

(さらに、今私はそれを見つける使命を帯びています...)

ありがとう、トッド NS

溶ける

オリジナルポスター
2006年12月4日


テキサス州ケイティ
  • 2007年6月8日
必要以上に長いことがわかっているすべての空白の文字列(X'20 ')でビットセットORを使用して、小文字の比較をテストできると思います...

分かりました

2004年10月25日
  • 2007年6月8日
それはほとんど信じられないことですが、標準C ++ライブラリに大文字と小文字が区別されないと思います。

ロケールについて心配したくない、または心配する必要がない場合は、次のようにします。
_stricmp(str1.c_str()、str2.c_str())
最も単純な解決策です(これも非常に効率的です)。

ロケールは物事をかなり複雑にします(まあ、これを非常に複雑にするのは実際には標準ライブラリの欠陥です)。
Lemmeは、ロケールを扱う何かへのリンクを見つけることができるかどうかを確認します...
これが1つです: http://lafstern.org/matt/col2_new.pdf
彼が何について話しているのか本当に知っているかどうかはわかりませんが、彼は知っているようです。彼はこの問題についてしばらく続けているので、問題を理解できますが、一番下までスキップして、最後のコードブロックをチェックして彼の最善の解決策を見つけることができます。 NS

溶ける

オリジナルポスター
2006年12月4日
テキサス州ケイティ
  • 2007年6月9日
iSeeに感謝します。ええ、彼はおそらく正しいです。ただし、私の目的では、7ビットのASCII文字コードを使用するので、このコードチャンクで十分だと思います。

確認してくれてありがとう-私がそれを見逃しているだけではないのを見てうれしいです。

トッド

コード:#include #include using namespace std ; bool case_insensitive_compare( string a, string b) { char char1, char2, blank = ' ' ; int len1 = a.length() ; int len2 = b.length() ; for (int i = 0 ; i input ; result = case_insensitive_compare(input, hello) ; std::cout << 'Result of compare of ' << input << ' to ' << hello << ' is ' << (result ? 'true' : 'false' ) << endl ; return 0; } NS

溶ける

オリジナルポスター
2006年12月4日
テキサス州ケイティ
  • 2007年6月10日
iSeeによると:ロケールについて心配したくない、または心配する必要がない場合は、次のようにします。
_stricmp(str1.c_str()、str2.c_str())
最も単純な解決策です(これも非常に効率的です)。

OK、あきらめます。どこで思いついたの? _stricmp

トッド

wittegijt

2007年2月18日
アイントホーフェン
  • 2007年6月11日
toddburchは言った:OK、私はあきらめます。どこで思いついたの? _stricmp

トッド

それはWindowsのものです。 Unixライブラリはstrcasecmpを使用します。これはにあります。

Wittegijt。

分かりました

2004年10月25日
  • 2007年6月11日
toddburchは言った:OK、私はあきらめます。どこで思いついたの? _stricmp

トッド

OK、それを捨ててすみません。

標準Cライブラリの一部だと思いましたが、そうではありません。これは、非公式に、Cライブラリのさまざまな実装にさまざまな名前で表示されます。したがって、大文字と小文字を区別しない比較も、公式のCライブラリの公式の一部ではありません。ギーゼ。とても大きな省略のようです。 VSでは_stricmp()またはstricmp()、MacではCodeWarriorではstricmp()またはstrcasecmp()、OS X 10.4 / Xcodeではstrcasecmp()です。

考えてみると、先頭のアンダースコアがヒントを与えてくれるはずです。

C標準に準拠したい場合は、ループ内でtolower()(またはtoupper())を使用して独自に実装する必要があると思います。

最初のパスが次のようになる可能性があることを見てみましょう(これは私の頭のてっぺんから外れており、テストされたコードではありません):
コード:#include ... int mystricmp(const char* str1, const char* str2) { if (str1 == str2) return 0; else if (str1 == NULL) return -1; else if (str2 == NULL) return 1; else { while (tolower(*str1) == tolower(*str2) && *str1 != 0 && *str2 != 0) { ++str1; ++str2; } if (*str1 *str2) return 1; else return 0; } }
とにかく、もう一度、悪いアドバイスをお詫びします。 CodeWarriorの時代からOSAPI(CFStringなど)を避けたかったMac OSXではC / C ++コーディングをあまり行っていなかったと思います... NS

溶ける

オリジナルポスター
2006年12月4日
テキサス州ケイティ
  • 2007年6月11日
ああ。理にかなっています。 Wittegijt&iSeeに感謝します。私は「百科事典C」(Sybex、1991)を読んでおり、Microsoftによるすべての(または少なくとも多くの)非標準キーワードには、すべて最初の文字にもアンダースコアが付いています。私にチップを払うべきだった。

OK、今から strcasecmp() 。私が使用しているcppreference.comWebサイトは、標準のC / C ++にすぎないようです。 Mac OS X XCode固有のリファレンスサイトをグーグルで検索しましたが、見つかりませんでした。優れたMacOS X C ++リファレンスWebサイトは何ですか?または、XCodeヘルプに組み込まれているC ++リファレンスがどこかにありますが、私はそれを見つけられませんでしたか?または、それがすべて失敗した場合、私も見逃したものがApple Development Centerにありますか?

XCodeディスクイメージと同じくらい大きいので、プロンプトが表示されたらダウンロードしてインストールします。確かに誰かが言語参照を持っています。つまり、最初にダウンロードしたJavaのものは巨大でした。

トッド

クリービック

2003年9月8日
  • 2007年6月11日
トッドバーチは言った:OK、今から strcasecmp() 。私が使用しているcppreference.comWebサイトは、標準のC / C ++にすぎないようです。 Mac OS X XCode固有のリファレンスサイトをグーグルで検索しましたが、見つかりませんでした。優れたMacOS X C ++リファレンスWebサイトは何ですか?または、XCodeヘルプに組み込まれているC ++リファレンスがどこかにありますが、私はそれを見つけられませんでしたか?または、それがすべて失敗した場合、私も見逃したものがApple Development Centerにありますか?

それはそこにありますが、それはPOSIXレイヤーにあるC関数を超えているとは思いません。ただ、AppleがPOSIXに追加したものすべてです。ターミナルを使用して、これらの機能の一部のマニュアルページにアクセスできます。 'man strcasecmp'は、その関数について説明しているページに直接移動し、その使用方法を説明します。

分かりました

2004年10月25日
  • 2007年6月11日
Xcodeをざっと見て、このページへのリンクを見つけました。

http://developer.apple.com/documentation/Darwin/Reference/ManPages/index.html

これは、Cライブラリ関数を含むOSXのマニュアルページのすべての目次です。

Xcodeリファレンスライブラリは、他のリソースに加えてマニュアルページにアクセスするため、これらはすべてXcodeから利用できます(私は常に「APIリファレンスで選択したテキストを検索」を使用します)。

C関数はセクション3にあるようです。各関数のドキュメントには、関数が準拠している標準に関する情報を提供する「標準」または「履歴」セクションが含まれているようです。どうやらstrcasecmp()は、コンプライアンス上の理由から「string.h」から「strings.h」に移動されたようです。どのようにして準拠するのか正確にはわかりません。非標準の関数はstring.hに表示されるべきではないので、別のヘッダーファイルに移動したことを意味していると思います。 NS

溶ける

オリジナルポスター
2006年12月4日
テキサス州ケイティ
  • 2007年6月11日
それは素晴らしいリファレンスページです!そのような情報がどこかにあると思いました!