我想比较字符串指针,而忽略他们的情况。我不能想到任何可以做到这一点的C函数。有没有办法比较字符串指针忽略他们的情况?
例如:
ToMMy == tommy == TOMMY == tOMmy etc.....
有谁知道如何可以在C做了什么?
我想比较字符串指针,而忽略他们的情况。我不能想到任何可以做到这一点的C函数。有没有办法比较字符串指针忽略他们的情况?
例如:
ToMMy == tommy == TOMMY == tOMmy etc.....
有谁知道如何可以在C做了什么?
如果只支持单字节英文字母来忽略情况,只需将每个字符转换为小写(或大写)并进行比较即可。
#include <ctype.h>
int cmp(const char *a, const char *b) {
while (*a || *b) {
int c1 = tolower((unsigned char)*a++);
int c2 = tolower((unsigned char)*b++);
if (c1 != c2) return c1 > c2 ? 1 : -1;
}
return 0;
}
您也可以使用快速位移,并消除'ctype.h'依赖。要转换为较低和比较:'int c1 =(unsigned)* a ++ | (1 << 5);'或更高的'(无符号)* a ++&〜(1 << 5);'它不比'tolower'好,但强调第6位作为7中的小写位位ASCII。 –
@ DavidC.Rankin在我看来,这会比'tolower'糟糕,因为它会损害可读性。使用'tolower'可以使意图更加清晰。 –
我不同意,这是*评论*的。例如'/ *转换为小写和比较* /'。没有任何评论,C中完成的大部分工作并不是很明显。这肯定会是一个需要评论的例子。如果你没有进行大量的转换,'tolower'没有任何问题,但如果你是这样,使用case bit可以帮助优化例程。 –
strcasecmp()
不是标准的C函数,但它在大多数编译器上。
自己写的:
int strnocasecmp(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;
}
}
不要忘了#include <ctype.h>
库tolower()
。
如果'char'被签名,这个程序可能会调用未定义的行为来将超出范围的值传递给'tolower()'。 – MikeCAT
谢谢!改性。 – PhotometricStereo
如果你有机会获得strcasecmp
在string.h
(POSIX),这可能是你最好的选择。
strcasecmp("TOMMY", "tOMmy") == 0
否则,这不是很难做出自己的。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
bool check_strings(const char* str1, const char* str2)
{
if (strlen(str1) != strlen(str2))
return false;
do {
if (tolower(*str1++) != tolower(*str2++))
return false;
} while(*str1 || *str2)
return true;
}
如果'char'被签名,该程序可能会调用未定义的行为来将超出范围的值传递给'tolower()'。 – MikeCAT
@MikeCAT如果您看到任何内容,请随时编辑代码。尽管我很确定它的工作原理(我显然没有在这方面做得太过辛苦),但我只是把它搞砸了。 –
看一看[strcasecmp](http://publib.boulder.ibm.com/infocenter/zos/v1r10/topic/com.ibm.zos.r10.bpxbd00/rsrccm.htm)在串.h – Trix
你的意思是字符串值本身还是C中的标识符? – e0k
建议您在未来提出问题之前进行一次Stackoverflow和/或Web搜索。已经有很多答案。例如:[在C中不区分大小写的字符串](http://stackoverflow.com/questions/5820810/case-insensitive-string-comp-in-c) – kaylum