我想比較字符串指針,而忽略他們的情況。我不能想到任何可以做到這一點的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