Искажение русских символов.
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Искажение русских символов. - 2009-05-10 08:20:07.593333
|
|
|
jogick
Сообщений: 244
Оценки: 0
Присоединился: 2007-09-15 09:24:58.160000
|
Я вообще по профессии электронщик. Сечас электронщик должен знать С. Решил учить. И вот тут проблема. Разбираясь с рекурсией и указателями и указтелями написал такой код. #include <stdio.h>
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++;
}
} Поидее он должен выводить введённый текст наоборот. С английскими буквами так и происходт, а вот вместо русских выводятся кракозябры Введи буковки: текст
�сѺеЂ
текст
Ещё программа плохо реагирует на пробелы, т.е. она берёт текст только до первого пробела. В чём проблема. Уже два дня пытаюсь разобраться.
|
|
|
RE: Искажение русских символов. - 2009-05-10 10:33:35.403333
|
|
|
harizma_xaker
Сообщений: 30
Оценки: 0
Присоединился: 2008-03-06 05:44:00.580000
|
чувак попробуй включить такую строку: … int main() { setlocale(0,""); …. …. }
|
|
|
RE: Искажение русских символов. - 2009-05-10 12:39:58.473333
|
|
|
jogick
Сообщений: 244
Оценки: 0
Присоединился: 2007-09-15 09:24:58.160000
|
Спасибо, но легче не стало. Интересно, ведь вывод того же текста, тем же способом, но в прямом порядке даёт нормальный результат.
|
|
|
RE: Искажение русских символов. - 2009-05-10 14:18:52.073333
|
|
|
oRb
Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
|
По поводу пробела. scanf("%s") всегда считывает до 1 пробела. Считывай с помощью fgetc или fgets с stdin.
|
|
|
RE: Искажение русских символов. - 2009-05-10 14:34:06.123333
|
|
|
Genco
Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
|
Чувак,ты не поверишь. Запустил - твой код работает. MSVS 2008. Я было подумал,что мусор в конце 1000-буквенной строки выводится,так нет, не видать его. Вот с пробелами - да,он до них только считывает scanf- ом и потому обрабатывает только эту часть. Ввод похитрее просто переделай.
|
|
|
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] >= 0)
return 1;
else if (c[1] >= 0)
return 2;
else
return 4;
}
|
|
|
|
|