Почему вот такая штука:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <wchar.h>
int compare(const void * ws1, const void * ws2);
int main(void)
{
wchar_t * ws;
setlocale(LC_ALL, "");
ws = wcsdup((wchar_t *)L"аАбБкКёЁеЕфФ");
if (ws == NULL) exit(1);
qsort(ws, wcslen(ws), sizeof(wchar_t), compare);
printf ("ws=[%ls]\n", ws);
free(ws);
return 0;
}
int compare(const void * ws1, const void * ws2) {
return wcscasecmp((wchar_t *)ws1, (wchar_t *)ws2);
}
выдаёт ws=[аАбБЕекКФфЁё] вместо ws=[аАбБеЕёЁкКфФ]?
Точнее:
- почему аА, но Ее?
- почему ё унесло в самый конец?
Дистрибутив Slackware 12.1, локаль ru_RU.utf8.
P.S. Кстати, не могу понять, откуда ругань:
$ gcc -Wall ./sort.c
./sort.c: В функции ‘main’
./sort.c:18: предупреждение: implicit declaration of function ‘wcsdup’
./sort.c:18: предупреждение: assignment makes pointer from integer without a cast
./sort.c: В функции ‘compare’
./sort.c:30: предупреждение: implicit declaration of function ‘wcscasecmp’
Однако g++ -Wall ./sort.c никаких предупреждений не даёт.
Форум —
Development

