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


Автор: Mastodont 24.12.2009, 11:38
Есть код
Код

// Рис. 2.7: fig02_07.cpp
// Программа вычисления среднего значения. Использует повторение, управляемое счетчиком.
#include<iostream.h>
#include<windows.h>

int rustext(char str[])
{
 CharToOem(str,str);
 cout << str;
}

using std::cout;
using std::cin;
using std::endl;

int main()
{
 int total, // сумма оценок
     gradeCounter, // число введенных оценок
     grade, // одна оценка
     average; // средняя оценка

 // инициализация
 total = 0; // установка суммы в исходное состояние
 gradeCounter = 1; // подготовка к циклу

 // вычисление
 while (gradeCounter <= 10) // цикл (10 итераций)
 {
  rustext("Введите оценку: "); // подсказка на ввод
  cin >> grade; // ввод значения grade
  total = total + grade; // добавление grade к total
  gradeCounter = gradeCounter + 1; // увеличение счетчика
 }

 // завершение
 average = total / 10; // целочисленное деление
 rustext("Средняя оценка равна ");
 cout << average << endl;

 system("pause");
 return 0; // указание на успешное завершение
}

Проблема в том, что первый раз строка "Введите оценку: " выводится нормально, а остальные 9 раз крякозябрами. Для ясности привожу скрин:
user posted image

Автор: smoke_man 24.12.2009, 12:34
На форуме не один раз это рассматривалось. Посмотри http://forum.vingrad.ru/forum/topic-283115.html

Добавлено через 4 минуты и 28 секунд
Попробуй setlocale(LC_ALL,"Russian");

Автор: mrbrooks 24.12.2009, 13:06
Цитата(smoke_man @  24.12.2009,  12:34 Найти цитируемый пост)
Попробуй setlocale(LC_ALL,"Russian");

ни когда не встречал, что бы для дебилдера (6, 2007, 2009) срабатывала setlocale or std::locale.  smile 

Автор: smoke_man 24.12.2009, 13:40
Да  - ща попробывал и правда не работает.
mrbrooks, спасибо, что поправил. Буду знать на будуще...

Автор: mrbrooks 24.12.2009, 13:43
smoke_man, вроде бы мелочь - а все одно - собирать костыль из CharToOem (особенной такой как у TC) - как то не современно  smile 

Автор: smoke_man 24.12.2009, 13:52
Mastodont, попробуй так:
Код

#include <string.h>

int rustext(const char * data)
{
 char *out = new char[strlen(data)+1];
 CharToOem(data,out);
 cout << out;
 delete [] out;
}
.....


Добавлено через 38 секунд
mrbrooks, согласен.

Автор: Mastodont 24.12.2009, 14:24
Цитата

собирать костыль из CharToOem (особенной такой как у TC) - как то не современно

А как сделать современно?
PS. Что значит "ТС"?  smile 
Код

int rustext(const char * data)
{
 char *out = new char[strlen(data)+1];
 CharToOem(data,out);
 cout << out;
 delete [] out;
}

Спасибо за вариант решения проблемы, но что то сложновато для меня пока с этими указателями, или что там звездочка обозначает  smile 

Автор: smoke_man 24.12.2009, 14:28
По мне так консольные приложения делать в VS. TC - топикстартер. 

Автор: mrbrooks 24.12.2009, 14:55
Цитата(Mastodont @  24.12.2009,  14:24 Найти цитируемый пост)
А как сделать современно?

современно - это значит компилятор должен поддерживать общепринятый стандарт. т.е. должна работать работать std::locale или хотя бы setlocale.

Цитата(smoke_man @  24.12.2009,  14:28 Найти цитируемый пост)
По мне так консольные приложения делать в VS.

я давно пришел к выводу, что и не только консольные  smile 

Автор: Mastodont 24.12.2009, 15:09
Цитата

TC - топикстартер

Понятно  smile 

А как сделать так, чтобы компилятор поддерживал std::locale или setlocale.

Автор: mrbrooks 24.12.2009, 15:14
Цитата(Mastodont @  24.12.2009,  15:09 Найти цитируемый пост)
А как сделать так, чтобы компилятор поддерживал std::locale или setlocale

взять и скачать - на выбор:
1. MS VS EE
2. mingw + eclipse
есть еще - но я бы остановился на первом

Автор: Mastodont 25.12.2009, 14:20
Цитата

есть еще - но я бы остановился на первом

То есть на MS VS EE?

Автор: mrbrooks 26.12.2009, 09:04
Цитата(Mastodont @  25.12.2009,  14:20 Найти цитируемый пост)
То есть на MS VS EE? 

точно!

Автор: shklowsky 26.12.2009, 11:19
мастодонт, не ведись, тебя манят в АД! smile 
установишь енту експресс едишн, и всё, погиб.
Получишь одни голые сишные рантаймы и половину оставшейся жизни будешь
скачивать всякие СДК и  справочные системы.
А вторую половину отпущенного тебе срока - пытаться это добро установить,
настроить и как- то в нем разобраться. smile  


mrbrooks
как не стыдно сманивать честных формошлепов! smile 
закончит ВУЗ, и забудет про консоль. smile 

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