Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Искажение русских символов.

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Искажение русских символов.
Имя
Сообщение << Старые топики   Новые топики >>
Искажение русских символов. - 2009-05-10 08:20:07.593333   
jogick

Сообщений: 244
Оценки: 0
Присоединился: 2007-09-15 09:24:58.160000
Я вообще по профессии электронщик. Сечас электронщик должен знать С. Решил учить. И вот тут проблема. Разбираясь с рекурсией и указателями и указтелями написал такой код.

#include &lt;stdio.h&gt; void invert (char *adr); void normal (char *adr); int main () // начало основной программы { char str [1000]; printf ("Введи буковки: "); scanf ("%s", &str); printf ("\n"); invert (&str[0]); printf ("\n"); normal (&str[0]); printf ("\n"); getchar (); } /* подпрограммы */ void invert (char *adr) { static int count=0; char a; if (*adr != 0) { invert (adr+1); putchar (*adr); } } void normal (char *adr) { while (*adr != 0) { putchar (*adr); adr++; } }
Поидее он должен выводить введённый текст наоборот. С английскими буквами так и происходт, а вот вместо русских выводятся кракозябры

Введи буковки: текст �сѺеЂ текст
Ещё программа плохо реагирует на пробелы, т.е. она берёт текст только до первого пробела.
В чём проблема. Уже два дня пытаюсь разобраться.
Post #: 1
RE: Искажение русских символов. - 2009-05-10 10:33:35.403333   
harizma_xaker

Сообщений: 30
Оценки: 0
Присоединился: 2008-03-06 05:44:00.580000
чувак попробуй включить такую строку:

int main()
{
setlocale(0,"");
….
….
}
Post #: 2
RE: Искажение русских символов. - 2009-05-10 12:39:58.473333   
jogick

Сообщений: 244
Оценки: 0
Присоединился: 2007-09-15 09:24:58.160000
Спасибо, но легче не стало.
Интересно, ведь вывод того же текста, тем же способом, но в прямом порядке даёт нормальный результат.
Post #: 3
RE: Искажение русских символов. - 2009-05-10 14:18:52.073333   
oRb

Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
По поводу пробела. scanf("%s") всегда считывает до 1 пробела. Считывай с помощью fgetc или fgets с stdin.
Post #: 4
RE: Искажение русских символов. - 2009-05-10 14:34:06.123333   
Genco

Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
Чувак,ты не поверишь. Запустил - твой код работает. MSVS 2008. Я было подумал,что мусор в конце 1000-буквенной строки выводится,так нет, не видать его. Вот с пробелами - да,он до них только считывает scanf- ом и потому обрабатывает только эту часть. Ввод похитрее просто переделай.
Post #: 5
RE: Искажение русских символов. - 2009-05-10 21:30:25.363333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

Интересно, ведь вывод того же текста, тем же способом, но в прямом порядке даёт нормальный результат.


Посчитай сколько байт занимает строка русского текста и сравни этот объём с количеством символов в ней. Быть может в качестве внутренней кодировки используется utf-8, которая на латиницу отводит 1 байт/символ, а на кириллицу 2?

Кстати-кстати! Это вполне возможно. Даже более того, именно так оно и будет, если ты в каком-нибудь линуксе сидишь, и в качестве локали используешь ru_RU.UTF8. Если это так, то способов бороться с этим груда (начиная с разбора строки на символы, кои могут занимать 1 байт, 2 или 4, продолжая использованием библиотек работающих с utf8, и заканчивая переходом на wchar_t вместо char), но по-моему, самый простой способ – это перейти на однобайтовую кодировку. Если не вообще, то по-крайней мере на те периоды, когда ты программки пишешь.

зы. кстати, измерить длину utf8 символа несложно. Если память мне не изменяет это делается примерно так:
int char_length (char *c) { if (c[0] &gt;= 0) return 1; else if (c[1] &gt;= 0) return 2; else return 4; }
Post #: 6
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Искажение русских символов.







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.