不区分大小写的stringcomp in C
我有两个邮政编码char*
,我想比较,忽略大小写。 有这样的function吗?
或者我必须循环使用tolower函数,然后进行比较?
任何想法如何将这个函数与string中的数字反应
谢谢
在C标准中没有这样做的function。 符合POSIX的Unix系统需要在头文件strings.h
包含strcasecmp
; 微软系统有stricmp
。 要在便携式方面,写你自己的:
int strcicmp(char const *a, char const *b) { for (;; a++, b++) { int d = tolower(*a) - tolower(*b); if (d != 0 || !*a) return d; } }
但请注意,这些解决scheme都不能使用UTF-8string,只能使用ASCIIstring。
看看strings.h
strcasecmp() 。
我会使用stricmp()
。 它比较两个string,而不考虑大小写。
请注意,在某些情况下,将string转换为小写可能会更快。
我发现内置的这种方法,从中包含标准头的附加string函数。
这里是相关的签名:
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)); }
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; }
参考
你可以得到一个想法,如果你没有任何图书馆,从这里开始实施一个有效的想法
它为所有256个字符使用一张表。
- 在那张表中,除了字母之外,所有字符都使用了ASCII码。
- 对于大写字母代码 – 下面的封装符号的表格代码。
那么我们只需要遍历一个string,并比较我们的表格单元格给定的字符:
const char *cm = charmap, *us1 = (const char *)s1, *us2 = (const char *)s2; while (cm[*us1] == cm[*us2++]) if (*us1++ == '\0') return (0); return (cm[*us1] - cm[*--us2]);
int strcmpInsensitive(char* a, char* b) { return strcmp(lowerCaseWord(a), lowerCaseWord(b)); } char* lowerCaseWord(char* a) { char *b=new char[strlen(a)]; for (int i = 0; i < strlen(a); i++) { b[i] = tolower(a[i]); } return b; }
祝你好运
Edit-lowerCaseWord函数得到一个char *variables,并且返回这个char *的小写值。 例如char *的值为“AbCdE”,将返回“abcde”。
基本上它是把两个char *variables转换成小写后,并使用strcmp函数。
例如,如果我们为“AbCdE”和“ABCDE”的值调用strcmpInsensitive函数,它将首先以小写(“abcde”)返回两个值,然后对它们执行strcmp函数。