По фразе
char может представляться как знаковое или беззнаковое байтовое значение (или указываться явно: unsigned char или signed char) ... но для наших дальнейших целей это не существенно.
Может сложиться впечатление, что char может быть равен signed char или unsigned char, но на самом деле — то три разных типа, как по мне, стоило бы подчеркнуть.
Как только внаш код начинает анализировать или изменять содержимое строки, нам необходимо работать с только с локализованными строками (строками широких символов wchar_t[]).
(внаш — опечатка)
Не поможет.
1. В среде Win в wchar_t возможны суррогатные пары, а значит рассмотренный Вами ранее реверс строки, не сработает и в случае wchar_t.
2. Умляуты и т.п., которые идут как отдельный символ, но не воспринимаются пользователем как таковой. Т.е. тот же реверс сработает неправильно. Плюс, для сортировки умляуты обычно игнорируют. Упомянутая ё — лишь один из случаев из множества сортировки не в соответствием с кодом символа.
ИМХО, после пары таких велосипедов для ознакомления стоит смотреть на библиотеку ICU. Особенно, если учесть не упомянутые особенности превращения в верхний/нижний регистр, которые зависят от локали (I i для английского, но I ı и İ i для турецкого), особенности немецкой ß, и другие сюрпризы.
Так:
stdout = freopen( NULL, "w", stdout );
Или даже так, ещё проще:
stdout = freopen( NULL, "w", stdout );
То ли у меня в глазах двоится…
ptintf()
Опечатка.
// Сортировка подпоследователности. Гарантированная сложность O( n*log(n) ) в любом случае.
// Обычно сортировка в куче выполняется в 25 раз медленнее быстрой сортировки sort().
Описка.