而不是<
运算符,使用不区分大小写的字符串比较函数。
C89/C99提供strcoll
(字符串整理),它进行了区域设置意识的字符串比较。它可以在C++中作为std::strcoll提供。在一些(大多数?)语言环境中,如en_CA.UTF-8,A
和a
(以及任一个的所有重音形式)都处于相同的等价类中。我认为如果整个字符串在其他方面是相等的,那么strcoll只会在等价类中进行比较,这会给与大小写不敏感的比较类似的排序顺序。排序规则(至少在GNU/Linux的英文语言环境中)会忽略某些字符(如[
)。所以ls /usr/share | sort
通过sort
给像
acpi-support
adduser
ADM_scripts
aglfn
aisleriot
我管输出,因为ls
做它自己的排序,这是不完全一样sort
的基于地区的排序。
如果您想将某些用户输入的任意字符串排序为用户直接看到的顺序,则区域设置感知的字符串比较通常是您想要的。只有大小写或重音不同的字符串不会比较相等,因此如果您使用稳定的排序并根据不同字符串比较相等的字符串,则不起作用,但否则您会得到不错的结果。根据使用情况,比简单的大小写不敏感的比较更好。
FreeBSD's strcoll过去了,可能对POSIX(ASCII)以外的区域还是区分大小写。该论坛帖子表明,在大多数其他系统上,它是而不是案例敏感。
MSVC为不区分大小写的校对提供了一个_stricoll
,意味着它的正常strcoll
区分大小写。然而,这可能意味着等值类内的比较不会发生。也许有人可以用MSVC测试下面的例子。
__libc_start_main(0x400586, 1, ...
setlocale(LC_ALL, "") = "en_CA.UTF-8" # my env contains LANG=en_CA.UTF-8
strcoll("FooBar - abc", "Foobar - bcd") = -1
strcoll("FooBar - abc", "FooBar - cde") = -2
strcoll("Foobar - bcd", "FooBar - cde") = -1
# the three strings are in order
+++ exited (status 0) +++
与gcc -Og -UUSE_LOCALE strcoll.c && ltrace ./a.out
:gcc -DUSE_LOCALE -Og strcoll.c && ltrace ./a.out
(或运行LANG = C ltrace a.out的)输出的
// strcoll.c: show that these strings sort in a different order, depending on locale
#include <stdio.h>
#include <locale.h>
int main()
{
// TODO: try some strings containing characters like '[' that strcoll ignores completely.
const char * s[] = { "FooBar - abc", "Foobar - bcd", "FooBar - cde" };
#ifdef USE_LOCALE
setlocale(LC_ALL, ""); // empty string means look at env vars
#endif
strcoll(s[0], s[1]);
strcoll(s[0], s[2]);
strcoll(s[1], s[2]);
return 0;
}
__libc_start_main(0x400536, ...
# no setlocale, so current locale is C
strcoll("FooBar - abc", "Foobar - bcd") = -32
strcoll("FooBar - abc", "FooBar - cde") = -2
strcoll("Foobar - bcd", "FooBar - cde") = 32 # s[1] should sort after s[2], so it's out of order
+++ exited (status 0) +++
POSIX.1-2001规定strcasecmp
。 POSIX规范说结果对于除纯ASCII之外的语言环境是“未指定的”,但我不确定普通实现是否正确处理utf-8。
请参阅this post for portability issues with strcasecmp, e.g. to Windows。查看关于该问题的其他C++方法来执行不区分大小写的字符串比较。
一旦你有一个区分大小写的比较功能,您可以与其他排序算法使用它,像C标准库qsort
,或C++ std::sort,而不是写自己为O(n^2)选择-分类。
由于b.buchhold的回答指出,在飞行中做了区分大小写的比较可能比一切都转换为小写一次,和排序索引数组慢。每个字符串的小写版本需要多次。 std::strxfrm将变换一个字符串,以便结果上的strcmp
将给出与原始字符串上的strcoll
相同的结果。
张贴您的选择排序。 –
@ Benny Saxeman什么是一串数组? –
@VladfromMoscowsorry,表示字符串数组 – bsem