有沒有辦法按字母順序對字符串數組進行排序,其中字符串既包含大寫字母又包含小寫字母?在C中使用大寫字母和小寫字母對字符串排序
由於大寫字母的ASCII值較低,所以像strcmp這樣的函數將始終顯示它在小寫字母之前。例如,可以說我們想排序「ABCD」,「ZZZZ」,「龜」,「JAVA」,「水」。
當使用像STRCMP功能將這些字符串進行排序,就變成:
ABCD JAVA ZZZZ 龜 水
當它應該是:
ABCD JAVA 龜 水 ZZZZ
有沒有辦法按字母順序對字符串數組進行排序,其中字符串既包含大寫字母又包含小寫字母?在C中使用大寫字母和小寫字母對字符串排序
由於大寫字母的ASCII值較低,所以像strcmp這樣的函數將始終顯示它在小寫字母之前。例如,可以說我們想排序「ABCD」,「ZZZZ」,「龜」,「JAVA」,「水」。
當使用像STRCMP功能將這些字符串進行排序,就變成:
ABCD JAVA ZZZZ 龜 水
當它應該是:
ABCD JAVA 龜 水 ZZZZ
與strcasecmp或strcoll一起使用qsort作爲比較函數。
strcasecmp可能會更快,但strcoll更靈活,並使用程序語言環境,以便非ASCII字符串工作。
試試strcoll(3)
。
如何使用呢?從我的理解,它調用strcmp,除非有一個區域設置...但我不知道區域是什麼。 – DemonicImpact 2010-09-16 18:24:56
strcoll工程案例類似於strcmp,不是針對您的問題的解決方案 – user411313 2010-09-16 18:47:29
@ user411313,取決於您設置的區域設置。 – 2010-09-16 21:01:14
在嚴格C89簡單的自己的解決方案應該有所幫助:
#include <ctype.h>
#include <string.h>
int strcmpIgnoreCase(const char *a,const char *b)
{
while(*a && *b)
{
register r=tolower(*a)-tolower(*b);
if(r)
return r;
++a;
++b;
}
return tolower(*a)-tolower(*b);
}
tolower **需要**一個'unsigned char'。爲了便於攜帶,您的代碼應該輸入參數:'tolower((unsigned char)* a)'。 *哦...併爲'register r'指定'int':這樣你的代碼也是'C99'兼容的。* – pmg 2010-09-16 20:03:33
strcasecmp不是C89/C99 - >不是ANSI C – user411313 2010-09-16 18:49:03