bergentroll
@bergentroll

Почему кракозябры при выводе строки задом наперед?

Почему приведенный код некорректно выводит массив символов при движении по массиву в обратном направлении?
GNU/Linux, gcc, локаль RU_ru-utf8, проблема конкретно с кириллицей.
#include <stdio.h>
#include <string.h>

int main() {
  char a[] = "А роза упала на лапу Азора";
  char *t = a;
  while (t <= a + strlen(a)) {
    printf("%c", *t);
    t++;
  };
  puts("");
  while (t >= a) {
    printf("%c", *t);
    t--;
  };
  puts("");
  return 0;
}
  • Вопрос задан
  • 221 просмотр
Решения вопроса 1
@abcd0x00
Для русских букв используй широкие символы wchar_t и широкосимвольные функции wcslen() и wprintf().
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
RiseOfDeath
@RiseOfDeath
Диванный эксперт.
В юникоде символы мнгобайтовые. Каждый байт символа (в utf-8, для utf-16 каждые два байта) начинается с единиц в младших битах их может быть от ноля (если это последний байт символа) и больше ( 1 если это предпоследний байт и т.п.) максимум хз сколько, читайте стандарт.
Ответ написан
Если кодировка utf-8, то это и не должно работать. printf("%c", *t) распечатает только содержимое одного байта, но не весь Unicode character. Более корректным было бы определить размер текущего символа, распечатать эту подстроку (в printf можно указать размер строки) и вместо t++ увеличить t на размер символа.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы