Начал изучать 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: Нашёл самый лучший идеальный вариант здесь и всем настоятельно рекомендую использовать ТОЛЬКО ЭТОТ ВАРИАНТ он самый лучший!
зачем так писать, когда cin>>name проще
– sercxjo Jun 07 '12 at 07:39рекомендую использовать ТОЛЬКО ЭТОТ ВАРИАНТ он самый лучший!
Это плохой совет. Как вы можете рекомендовать что-либо, если сами не до конца разобрались? И, как сказал предыдущий оратор, переходите на Уникод, если не можете в кодовые страницы.
@Rules, и еще... Если задаете повторные вопросы, убедитесь, что это действительно необходимо. Например, обязательно укажите чем не устроили ответы на предыдущую версию. Читать одно и то же - скучно.
PS: Лично я бы перекрыл
– karmadro4 Jun 07 '12 at 15:13ostream::operator<<иistream::operator>>для прозрачности.