在C中使用大写字母和小写字母对字符串排序

问题描述:

有没有办法按字母顺序对字符串数组进行排序,其中字符串既包含大写字母又包含小写字母?在C中使用大写字母和小写字母对字符串排序

由于大写字母的ASCII值较低,所以像strcmp这样的函数将始终显示它在小写字母之前。例如,可以说我们想排序“ABCD”,“ZZZZ”,“龟”,“JAVA”,“水”。

当使用像STRCMP功能将这些字符串进行排序,就变成:

ABCD JAVA ZZZZ 龟 水

当它应该是:

ABCD JAVA 龟 水 ZZZZ

与strcasecmp或strcoll一起使用qsort作为比较函数。

strcasecmp可能会更快,但strcoll更灵活,并使用程序语言环境,以便非ASCII字符串工作。

+0

strcasecmp不是C89/C99 - >不是ANSI C – user411313 2010-09-16 18:49:03

试试strcoll(3)

+0

如何使用呢?从我的理解,它调用strcmp,除非有一个区域设置...但我不知道区域是什么。 – DemonicImpact 2010-09-16 18:24:56

+0

strcoll工程案例类似于strcmp,不是针对您的问题的解决方案 – user411313 2010-09-16 18:47:29

+0

@ 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); 
} 
+1

tolower **需要**一个'unsigned char'。为了便于携带,您的代码应该输入参数:'tolower((unsigned char)* a)'。 *哦...并为'register r'指定'int':这样你的代码也是'C99'兼容的。* – pmg 2010-09-16 20:03:33