2016-02-07 63 views
2

我想比较字符串指针,而忽略他们的情况。我不能想到任何可以做到这一点的C函数。有没有办法比较字符串指针忽略他们的情况?

例如:

ToMMy == tommy == TOMMY == tOMmy etc..... 

有谁知道如何可以在C做了什么?

+3

看一看[strcasecmp](http://publib.boulder.ibm.com/infocenter/zos/v1r10/topic/com.ibm.zos.r10.bpxbd00/rsrccm.htm)在串.h – Trix

+0

你的意思是字符串值本身还是C中的标识符? – e0k

+3

建议您在未来提出问题之前进行一次Stackoverflow和/或Web搜索。已经有很多答案。例如:[在C中不区分大小写的字符串](http://stackoverflow.com/questions/5820810/case-insensitive-string-comp-in-c) – kaylum

回答

1

如果只支持单字节英文字母来忽略情况,只需将每个字符转换为小写(或大写)并进行比较即可。

#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; 
} 
+0

您也可以使用快速位移,并消除'ctype.h'依赖。要转换为较低和比较:'int c1 =(unsigned)* a ++ | (1 << 5);'或更高的'(无符号)* a ++&〜(1 << 5);'它不比'tolower'好,但强调第6位作为7中的小写位位ASCII。 –

+0

@ DavidC.Rankin在我看来,这会比'tolower'糟糕,因为它会损害可读性。使用'tolower'可以使意图更加清晰。 –

+0

我不同意,这是*评论*的。例如'/ *转换为小写和比较* /'。没有任何评论,C中完成的大部分工作并不是很明显。这肯定会是一个需要评论的例子。如果你没有进行大量的转换,'tolower'没有任何问题,但如果你是这样,使用case bit可以帮助优化例程。 –

1

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()

+2

如果'char'被签名,这个程序可能会调用未定义的行为来将超出范围的值传递给'tolower()'。 – MikeCAT

+0

谢谢!改性。 – PhotometricStereo

0

如果你有机会获得strcasecmpstring.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; 
} 
+0

如果'char'被签名,该程序可能会调用未定义的行为来将超出范围的值传递给'tolower()'。 – MikeCAT

+0

@MikeCAT如果您看到任何内容,请随时编辑代码。尽管我很确定它的工作原理(我显然没有在这方面做得太过辛苦),但我只是把它搞砸了。 –

相关问题