2009-11-23 9 views
25

私は、ソースコードの以下の非常に非常にシンプルな一枚にコンパイルしようとしています:G ++エラー:「stricmp」はこのスコープで宣言された(しかし、「strcmpの」のOK)されなかった

#include <cstring> 
// #include <string.h> 
// using namespace std; 

class Helper { 
public: 
    int cStringsAreEqual(const char *s1, const char *s2) { 
     return stricmp(s1, s2); 
    } 
}; 

を...しかし、私次のエラーメッセージを取得しています:私は代わりにstricmp()のstrcmp()を使用する場合

g++ error: ‘stricmp’ was not declared in this scope 

しかしその後、すべてが素晴らしいです!

ここで間違いがありますか? stricmp()が許可されているときにstricmp()を許可してはいけませんか?

Sureley、これはstrcmp/stricmpを使わずにはるかに良い方法で書くことができます。

しかし、それはここでのポイントではありません。

私はstricmp()の呼び出しを多く使うソフトウェアを移植しています。どういうわけか可能なら、私はstricmpへのすべての呼び出しを変更するために必要なすべての努力を避けたいと思います。

これに関するお手伝いをさせていただきます。

ところで:私はg ++ v4.4.1でUbuntu karmic OS(v9.10)を使用しています。

私は、あなたも '#include string.h'または 'namespace std'を使って試してみましたが、何も助けてくれませんでした。

+0

は(後者は大文字と小文字が区別されます)stricmpとのstrcmpが同じではないことを考えると、あなたはとにかくそれらを変更する前にhesistateする場合があります。 – Brian

+2

彼らは同じではないと私は知っています。だから私はstricmpを使用したいが、strcmpは使用したくない。 –

+0

」と「」はまったく同じものではないことに注意してください。あなたの問題の原因ではありませんが、名前がグローバル名前空間にインポートされていると仮定するのではなく、 'std :: strcmp'(または' std :: strcoll')を書く必要があります。 –

答えて

34

お試しstrcasecmp()ここにはmanual pageがあります。 4.4BSDとPOSIX.1-2001に準拠しています。

+0

これはオプションになります。strcasecmp()は同じパラメータを持つようです。したがって、グローバルな変更を行う小さなperlスクリプトを作成するのは難しいことではありません。どうもありがとう! –

+0

問題ありません。また、ロケール設定がこの機能にどのように影響するかについてのMark Rushakoffのコメントを見てください。 – Gonzalo

+1

strcasecmpはあなたのロケールによって異なることに注意してください。したがって、strcasecmp( "div"、 "DIV")はトルコ語のロケールでは0を返しません(小文字のIはıです)。 – rockdaboot

13

stricmp is neither POSIX nor ANSIしたがって、コンパイラまたは標準ライブラリがPOSIXまたはANSI標準ライブラリ関数を厳密に遵守している場合(おそらくGCCスイートの場合のように)、strcmpが許可されているかどうかは関係ありません。

+0

同じセマンティクスを持つPOSIX/ANSIの代替手段がありますか? –

+3

「大文字と小文字の区別」という考え方は、ロケールやOSによって異なるため、複雑です。この質問の答えの一部を参照してください:http://stackoverflow.com/questions/11635/case-insensitive-string-comparison-in-c –

+0

私はCygwinでWindows 7でEclipse CDTを使用していますが、stricmpはそこで受け入れられています。私のLinuxマシンでは、GCCを使用してもそれは受け付けられません。これは、Cygwinに含まれているコンパイラがPOSIXまたはANSIでないことを意味しますか? –

10

あなたが探しているプラ​​ットフォームでstricmpをstrcasで上書きするための定義を追加します。

#ifdef _IPHONE <- your platform define here 
#define stricmp strcasecmp 
#define strnicmp strncasecmp 
#endif 

次に、stricmpは常に使用できます。

必要であれば、あなた自身の作るためにかなり簡単
+0

私は同じエラーがありましたが、これで問題は解決しました。 –

+0

ここでは、これをどこに入れますか? –

+0

ヘッダーに入れるか、他のプリプロセッサディレクティブ(ifdefs/defines)を使って上に置いてください:http://www.cplusplus.com/doc/tutorial/preprocessor/ #define _IPHONEは上記の使用法から " <?.. "part" –

-1

...

int my_stricmp (const char *s1, const char *s2) 
{ 
    while (*s1 != 0 && *s2 != 0) 
    { 
     if (*s1 != *s2 && ::toupper (*s1) != ::toupper(*s2)) 
     { 
      return -1; 
     } 
     s1++; 
     s2++; 
    } 
    return (*s1 == 0 && *s2 == 0) ? 0 : -1; 
} 
+0

's1'が' s2'よりも後にソートされるとき、これは正の値を返しますか? 'std :: strcmp()'と異なるインターフェースを持つことを意図していますか? –

+0

@TobySpeight –

+1

'CAVEAT':' :: toupper'の呼び出しは、ロケール固有のものです。実行する場所によって結果が異なる場合があります。ロケール対応のオーバーライドの使用を検討してください代わりに。 –

関連する問題