2016-02-07 61 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如果您看到任何內容,請隨時編輯代碼。儘管我很確定它的工作原理(我顯然沒有在這方面做得太過辛苦),但我只是把它搞砸了。 –

相關問題