Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
26 setlocale(LC_ALL, locale);27 strcpy(curloc, locale);28 }2930 printf("%s: strcmp("%s", "%s") is %dn", curloc, left,31 right, strcmp(left, right));32 printf("%s: strcoll("%s", "%s") is %dn", curloc, left,33 right, strcoll(left, right));3435 printf("n--> "); fflush(stdout);36 }3738 exit(0);39 }Программа читает входные строки, состоящие из двух сравниваемых слов и необязательной локали, использующейся для сравнения. Если локаль дана, она становится локалью для последующих элементов. Программа начинает с любой локалью, которая установлена в окружении.
Массив
curlocleftrightlocaleСтроки 25–28 устанавливают новую локаль, если она приведена. Строки 30–33 выводят результаты сравнения, а строка 35 приглашает для дальнейшего ввода. Вот демонстрация:
$ <b>ch13-compare</b> /* Запуск программы */--> <b>ABC abc</b> /* Ввести два слова */С: strcmp("ABC", "abc") is -1 /* Программа началась в локали "С" */С: strcoll("ABC", "abc") is -1 /* В локали "С" идентичные рез-ты */--> <b>ABC abc en_US</b> /* Слова те же, локаль "en_US" */en_US: strcmp("ABC", "abc") is -1 /* strcmp() без изменений */en_US: strcoll("ABC", "abc") is 2 /* рез-ты strcoll() изменились' */--> <b>ABC abc en_US.UTF-8</b> /* Слова те же, локаль "en_US.UTF-8" */en_US.UTF-8: strcmp("ABC", "abc") is -1en_US. UTF-8: strcoll("ABC", "abc") is 6 /* Другое значение, все еще положительное */--> <b>junk JUNK</b> /* Новые слова */en_US.UTF-8: strcmp("junk", "JUNK") is 1 /* предыдущая локаль */en_US.UTF-8: strcoll("junk", "JUNK") is -6Эта программа ясно показывает различие между
strcmp()strcoll()strcmp()strcoll()en_USЗАМЕЧАНИЕ. Специфическая для локали сортировка строк является проблемой также и для сопоставления регулярных выражений. Регулярные выражения допускают диапазоны символов внутри выражений со скобками, такие, как '
[a-z]["-/]Для локалей, не являющихся ASCII, такие диапазоны как '
[a-z]["-/]en_US.UTF-8Долговременным наиболее переносимым решением является использование классов символов POSIX, таких, как '
[[:lower:]][[:punct:]]Основанная на локалях сортировка потенциально дорогостоящая. Если вы ожидаете большого числа сравнений, где по крайней мере одна из строк не будет изменяться или где значения строк будут сравниваться друг с другом по несколько раз (как при сортировке списка), следует рассмотреть использование функции
strxfrm()strcmp()strxfrm()#include <string.h> /* ISO С */size_t strxfrm(char *dest, const char *src, size_t n);Идея в том, что
strxfrm()srcdestdestСтандарт POSIX явным образом разрешает устанавливать в
ndest NULLstrxfrm()src