88

char*大文字と小文字を区別せずに比較したい2 つの郵便番号があります。これを行う機能はありますか?

または、関数を使用するたびにループしてからtolower比較する必要がありますか?

この関数が文字列内の数字とどのように反応するかについてのアイデア

ありがとう

4

12 に答える 12

67

C 標準には、これを行う関数はありません。POSIX に準拠する Unix システムでstrcasecmpは、ヘッダーにstrings.h;を含める必要があります。Microsoft システムにはstricmp. ポータブル側にするには、独自に記述します。

int strcicmp(char const *a, char const *b)
{
    for (;; a++, b++) {
        int d = tolower((unsigned char)*a) - tolower((unsigned char)*b);
        if (d != 0 || !*a)
            return d;
    }
}

ただし、これらのソリューションはいずれも UTF-8 文字列では機能せず、ASCII 文字列のみで機能することに注意してください。

于 2011-04-28T15:21:22.903 に答える
45

strcasecmp()をご覧くださいstrings.h

于 2011-04-28T15:11:16.040 に答える
9

from という名前の組み込みのメソッドが見つかりました。これには、標準の header に追加の文字列関数が含まれています。

関連する署名は次のとおりです。

int  strcasecmp(const char *, const char *);
int  strncasecmp(const char *, const char *, size_t);

また、xnu カーネル (osfmk/device/subrs.c) では同義語であり、次のコードで実装されていることもわかりました。そのため、元の strcmp 関数と比較して数値の動作が変化することは期待できません。

tolower(unsigned char ch) {
    if (ch >= 'A' && ch <= 'Z')
        ch = 'a' + (ch - 'A');
    return ch;
 }

int strcasecmp(const char *s1, const char *s2) {
    const unsigned char *us1 = (const u_char *)s1,
                        *us2 = (const u_char *)s2;

    while (tolower(*us1) == tolower(*us2++))
        if (*us1++ == '\0')
            return (0);
    return (tolower(*us1) - tolower(*--us2));
}
于 2016-01-04T11:16:54.103 に答える
6

私は使用しますstricmp()。大文字と小文字を区別せずに 2 つの文字列を比較します。

場合によっては、文字列を小文字に変換した方が速くなることに注意してください。

于 2011-04-28T15:17:43.810 に答える
0

null で終了する文字がある場合:

   bool striseq(const char* s1,const char* s2){ 
     for(;*s1;){ 
       if(tolower(*s1++)!=tolower(*s2++)) 
         return false; 
      } 
      return *s1 == *s2;
    }

または、ビット演算を使用するこのバージョンでは:

    int striseq(const char* s1,const char* s2)
       {for(;*s1;) if((*s1++|32)!=(*s2++|32)) return 0; return *s1 == *s2;}

これが記号で機能するかどうかはわかりません。そこではテストしていませんが、文字では問題なく機能します。

于 2022-02-22T18:11:03.490 に答える
0
static int ignoreCaseComp (const char *str1, const char *str2, int length)
{
    int k;
    for (k = 0; k < length; k++)
    {

        if ((str1[k] | 32) != (str2[k] | 32))
            break;
    }

    if (k != length)
        return 1;
    return 0;
}

参照

于 2016-02-14T10:17:06.880 に答える