| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Зачем повсюду указателей наставил? |
| Автор: Волод 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 |
| Всем спасибо, буду пробовать! |