而不是<
運算符,使用不區分大小寫的字符串比較函數。
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