Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кирилизация консоли 
:(
    Опции темы
Волод
Дата 25.11.2004, 10:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всем привет! Подскажите, как мне обойти следующую проблему.
Собственно, я новичок, пытаюсь изучить великий и могучий С++. Работаю на компиляторе 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 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
char *russ(char *question)

Зачем повсюду указателей наставил?
  Вверх
Волод
Дата 25.11.2004, 11:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вроде же написал выше: потому-что передаю в функцию массив через указатель и возвращаю указатель на массив символов (строку). А как надо?
  Вверх
_hunter
Дата 25.11.2004, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Alastis
Дата 26.11.2004, 06:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 15.11.2004
Где: Казахстан, Астана

Репутация: 4
Всего: 10



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

Это сообщение отредактировал(а) Alastis - 26.11.2004, 06:16


--------------------
Прости, что я говорю, когда ты меня перебиваешь.
PM MAIL WWW ICQ   Вверх
Intro
Дата 26.11.2004, 16:16 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вот так
#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 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











getch();
  Вверх
!Жека!
  Дата 26.11.2004, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 26.11.2004

Репутация: нет
Всего: нет



Не парся и напиши следующие:

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("тра ля ля и все такое");
PM MAIL   Вверх
Intro
Дата 26.11.2004, 20:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











!Жека!
Не вижу рациональности...
  Вверх
Guest
Дата 27.11.2004, 23:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всем спасибо, буду пробовать!
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.