-3

Начал изучать C++ и столкнулся с проблемой вывода русских букв в консоль. У нас на форуме узнал, что чтобы C++ правильно отображались русские буквы, надо применять setlocale(LC_ALL, "Russian") и применял её, всё было нормально, пока в книге не прочитал про ввод строк и строки и запустил пример из книги... В программе, код которой идёт ниже, если оставить setlocale, то программа выводит русские буквы нормально, а вот если запросить строку и ввести русские буквы, а потом вывести их, то они портятся при последующем выводе. Если убрать setlocale, то русские буквы при вводе, а потом выводе не портятся, зато вывод их из программы портится.

// insrtl.cpp -- чтение более одной строки 
#include <iostream> 
int main(){ 
   using namespace std; 
   setlocale(LC_ALL,"Russian");
   const int ArSize = 20; 
   char name[ArSize]; 
   char dessert[ArSize]; 
   cout << "Введите свое имя: \n"; 
   cin >> name; 
   cout << "Введите свой любимый десерт: \n"; 
   cin >> dessert; 
   cout << "У меня есть вкусный " << dessert; 
   cout << " для вас, " << name << ". \n";
   system("PAUSE"); 
   return 0;
}

Вопрос: как мне поступить, чтобы можно было и из программы русские буквы выводить и при запросе ввода и последующем выводе они не портились?

UPD: попробовал так:

// insrtl.cpp -- чтение более одной строки 
#include <iostream> 
#include <windows.h>

char Rus(char str) { static char s[1024]; CharToOem(str, s); return s; } int main(){ using namespace std; const int ArSize = 20; char name[ArSize]; char dessert[ArSize]; cout << Rus("Введите свое имя: \n"); cin >> name; cout << Rus("Введите свой любимый десерт: \n"); cin >> dessert; cout << Rus("У меня есть вкусный ") << Rus(dessert); cout << Rus(" для вас, ") << Rus(name) << ". \n"; system("PAUSE"); return 0; }

Но вообще получается что-то странное похоже что в переменные записываются выводимые строки : в desert записывается "У меня есть вкусный " а в name записывается " для вас, ". И что делать я хочу русский язык а не

C:\Users\Rules>"D:\ProjectsC++\C++ Learning\Chapter 4\insrt1\insrt1.exe"
Введите свое имя:
Иван
Введите свой любимый десерт:
Какао
У меня есть вкусный ? Є R для вас, ?ў -.
Для продолжения нажмите любую клавишу . . .

после моего кода и не то что стало после UPD а именно:

C:\Users\Rules>"D:\ProjectsC++\C++ Learning\Chapter 4\insrt1\insrt1.exe"
Введите свое имя:
Иван
Введите свой любимый десерт:
Какао
У меня есть вкусный У меня есть вкусный  для вас,  для вас, .
Для продолжения нажмите любую клавишу . . .

UPD: Нашёл самый лучший идеальный вариант здесь и всем настоятельно рекомендую использовать ТОЛЬКО ЭТОТ ВАРИАНТ он самый лучший!

Rules
  • 4,966
  • 10
  • 34
  • 62
  • проблема относится к windows.

    system("PAUSE");

    зачем так писать, когда cin>>name проще

    – sercxjo Jun 07 '12 at 07:39
  • Какая программа? dev C++ что ли? – johniek_comp Jun 07 '12 at 08:49
  • Используйте юникод – IronVbif Jun 07 '12 at 09:48
  • Да DEV C++ компилятор – Rules Jun 07 '12 at 10:48
  • 2

    рекомендую использовать ТОЛЬКО ЭТОТ ВАРИАНТ он самый лучший!

    Это плохой совет. Как вы можете рекомендовать что-либо, если сами не до конца разобрались? И, как сказал предыдущий оратор, переходите на Уникод, если не можете в кодовые страницы.

    @Rules, и еще... Если задаете повторные вопросы, убедитесь, что это действительно необходимо. Например, обязательно укажите чем не устроили ответы на предыдущую версию. Читать одно и то же - скучно.

    PS: Лично я бы перекрыл ostream::operator<< и istream::operator>> для прозрачности.

    – karmadro4 Jun 07 '12 at 15:13
  • да я видел этот вариант он у меня не сработал и у тех кто оставлял комменты если и сработал то только у 3 из 10 да я ВСЁ уже перепробовал рыскал в нете 3 дня у уж поверьте мне предложенный мною вариант САМЫЙ ЛУЧШИЙ В ДАННОМ КОНТЕКСТЕ ВОПРОСА! – Rules Jun 08 '12 at 05:00
  • Вы чё совсем обалдели я выложил вопрос потом сам нашёл ответ выложил его вам !Зырьте чё вам ещё надо! Нет непонимают! Ёщё минусуют!! – Rules Jun 08 '12 at 08:19
  • 3
    @Rules Ни единого разрыва не было. – M. Williams Jun 08 '12 at 08:38

2 Answers2

4
SetConsoleCP(1251); // Ввод с консоли в кодировке 1251
SetConsoleOutputCP(1251); // Вывод на консоль в кодировке 1251. Нужно только будет изменить шрифт консоли на Lucida Console или Consolas

А вообще полезно пользоваться поиском по форуму, подобные вопросы задавались уже сотню раз наверное.

insolor
  • 49,104
  • Говорит что не определено какой заголовочный файл подключить надо? – Rules Jun 07 '12 at 11:20
  • Я подключил <windows.h> но теперь на SetConsoleCP не ругается зато говорит что SetConsoleOutput не определено чё дклать? – Rules Jun 07 '12 at 11:23
  • Исправил, SetConsoleOutputCP(1251) – insolor Jun 07 '12 at 11:33
  • Теперь всё компилируется но получается опять абракадабра! Какие есть ещё кодировки? По перебираю может какая поможет ): – Rules Jun 07 '12 at 11:37
  • Если сделать вместо 1251 866 то получается так:
    ┬тхфшЄх ётюх шь :
    Иван
    ┬тхфшЄх ётющ ы■сшь√щ фхёхЁЄ:
    Какао
    ╙ ьхэ  хёЄ№ тъєёэ√щ Какао фы  трё, Иван.
    Для продолжения нажмите любую клавишу . . .
    
    

    то есть осталось только в файле правильно строки сохранять но в Dev C++ я не могу сменить кодировку и он не признаётся какую использует но блокнот говорит что кодировка ANSI что делать?

    – Rules Jun 07 '12 at 11:41
  • 2
    @Rules, нужно именно так как написано в ответе и в свойствах консоли выбрать шрифт Lucida Console или Consolas. – insolor Jun 07 '12 at 11:46
0

Использовал такую функцию

#include <windows.h>

char Rus(char str) { static char s[1024]; CharToOem(str, s); return s; } ... std::cout << Rus("Русский текст");

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
  • Это сработало неправильно, посмотрите UPD к моему вопросу! – Rules Jun 07 '12 at 11:07