Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Кирилизация консоли


Автор: Волод 25.11.2004, 10:59
Всем привет! Подскажите, как мне обойти следующую проблему.
Собственно, я новичок, пытаюсь изучить великий и могучий С++. Работаю на компиляторе VC C++ и практикуюсь на небольших консольных программках из учебника, который сейчас читаю. Очень хотелось бы иметь поддержку кириллицы в консоли, пока смог этого добиться через следующий код:
void main()
{
char question[]="Введите число от 1 до 9";
CharToOem(question, question);
cout << question<<endl;
}

Через добавление этого кода моя консоль стала поддерживать кириллицу. Напрягает только то, что постоянно приходиться писать три строки кода для вывода текста в консоли по русски. Попробовал я вынести код в отдельную функцию (russ), а вызов делать примерно так:
cout << russ(“Введите число от 1 до 9”)<<endl;
но функция не работает – либо компилятор жалуется на невозможность преобразования конвертируемых типов, либо синтаксис контроль программа проходит, но аварийно завершается.

А вот и сама функция:

char *russ(char *question)
{
CharToOem(question, question);
return question;
}

Чувствую, что здесь где-то серьезно напутал с указателями – ссылками, но как не комбинировал символы * и &, результата добиться не смог.
Мои соображения следующие:
в С++ строку можно рассматривать как массив, через указатель мы встаем в начало массива, соответственно получаем его (строку-массив) как входящий параметр, изменяем через API-функцию и возвращаем опять же указатель на массив. То есть после выполнения функции строка должна быть преобразована и указатель спозиционирован на начале массива. Соответственно, строка должна нормально считаться в поток count, но этого не происходит . Где я не прав? Буду очень признателен за грамотные ответы с объяснением.
Ну и второй вопрос на эту - же тему: Может, существуют другие способы кирилизации символов в консоли? - и какой лучше/удобнее применять.

Спасибо всем.
Волод

Автор: КС 25.11.2004, 11:16
Цитата
char *russ(char *question)

Зачем повсюду указателей наставил?

Автор: Волод 25.11.2004, 11:26
Вроде же написал выше: потому-что передаю в функцию массив через указатель и возвращаю указатель на массив символов (строку). А как надо?

Автор: _hunter 25.11.2004, 12:11
Проблема в том, что cout ничего не знает о твоей функции и соответственно не может в нее _вывести_. Используй перегрузку операторов.
+ в региональных настройках выставь соотвествующий язык для не Юникод-программ.

Автор: Alastis 26.11.2004, 06:15
1. Написать setlocale(LC_CTYPE, ".866" );
2. Все делать в UNICODE. Используй wstring, wprintf и т.д.

Автор: Intro 26.11.2004, 16:16
Вот так
#define MAX_SIZE 9999

char krakozybr_to_rus(char string[MAX_SIZE]) // или применять sizeof
{
char res[MAX_SIZE]; // или динамический массив
if(string != "\0")
{
CharToOem(string, res); // Или как там, какой аргумент первей стоять должен ?
Return(res);
}
}
вот и всё, а теперь применение...

void main()
{
char qu[] = "Привет, если ты видешь русские буквы, то нажми any key\n";
cout << krakozybr_to_rus(qu) << endl;
}
Всё ИМХО...

Автор: Intro 26.11.2004, 16:17
getch();

Автор: !Жека! 26.11.2004, 19:42
Не парся и напиши следующие:

unsigned char *RUSS(unsigned char *str)
{
for (int i = 0; str[i]; ++i)
if (str[i] >= 192 && str[i] <= 239) str[i] -= 64;
else if (str[i] >= 240 && str[i] <= 255) str[i] -= 16;
return str;
}

и вызывай ее: cout << RUSS("тра ля ля и все такое");

Автор: Intro 26.11.2004, 20:36
!Жека!
Не вижу рациональности...

Автор: Guest 27.11.2004, 23:21
Всем спасибо, буду пробовать!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)