char*
大文字と小文字を区別せずに比較したい2 つの郵便番号があります。これを行う機能はありますか?
または、関数を使用するたびにループしてからtolower
比較する必要がありますか?
この関数が文字列内の数字とどのように反応するかについてのアイデア
ありがとう
char*
大文字と小文字を区別せずに比較したい2 つの郵便番号があります。これを行う機能はありますか?
または、関数を使用するたびにループしてからtolower
比較する必要がありますか?
この関数が文字列内の数字とどのように反応するかについてのアイデア
ありがとう
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 文字列のみで機能することに注意してください。
strcasecmp()
をご覧くださいstrings.h
。
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));
}
私は使用しますstricmp()
。大文字と小文字を区別せずに 2 つの文字列を比較します。
場合によっては、文字列を小文字に変換した方が速くなることに注意してください。
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;}
これが記号で機能するかどうかはわかりません。そこではテストしていませんが、文字では問題なく機能します。
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;
}