Dark7Lord
@Dark7Lord
Студент

Как сделать ввод русского текста через оператор std::cin нормальным и без крякозябр?

Решил перевести из англа на русский перевести консольную игру "Словомеска" по книге "Изучаем С++ через программирование игр", проблема в вводимых словах, которые почему преобразуюся в крякозябры (когда смотрел пошагово), что не так с кодировками и есть ли простое решение

// Word Jumble
// The classic word jumble game where the player can ask for a hint

#include
#include
#include
#include
#include

using namespace std;

int main()
{
setlocale(LC_ALL, "Russian");

enum fields { WORD, HINT, NUM_FIELDS };
const int NUM_WORDS = 5;
const string WORDS[NUM_WORDS][NUM_FIELDS] =
{
{"стена", "Они тебя окружают и защищают, по крайней мера одна она из этих сестер, что служат дому опорами.."},
{"стекло", "Сквозь нее ты смотришь, но он не пропускает холод улиц.."},
{"собака", "Лает, кусает, в дом не пускает.."},
{"желания", "Причина всех твоих страдании.."},
{"правда", "В отличии от лжи, она таааак горька..."}
};

srand(static_cast(time(0)));
int choice = (rand() % NUM_WORDS);
string theWord = WORDS[choice][WORD]; // word to guess
string theHint = WORDS[choice][HINT]; // hint for word

string jumble = theWord; // jumbled version of word
int length = jumble.size();
for (int i = 0; i < length; ++i)
{
int index1 = (rand() % length);
int index2 = (rand() % length);
char temp = jumble[index1];
jumble[index1] = jumble[index2];
jumble[index2] = temp;
}

cout << "\t\t\tДобро пожаловать в игру \"Словомеска\"\n\n";
cout << "Угадай все буквы, чтобы сложилось слово\n";
cout << "Введи 'hint' для получения маленького намека :) .\n";
cout << "Введи 'quit' чтобы покинуть нас :( .\n\n";
cout << "Зашифрованное слово: " << jumble;

string guess;
cout << "\n\n А твой ответ: ";
cin >> guess;

while ((guess != theWord) && (guess != "quit"))
{
if (guess == "hint")
{
cout << theHint;
}
else
{
cout << "Не угадал.";
}

cout << "\n\nТвое слово: ";
cin >> guess;
}

if (guess == theWord)
{
cout << "\n Угадал? Вот молодец! Я тобой горжусь (голосом бабушки)!\n";
}

cout << "\n Спасибо, что сыграл...\n";
system("pause");

return 0;
}
  • Вопрос задан
  • 2466 просмотров
Решения вопроса 2
Dark7Lord
@Dark7Lord Автор вопроса
Студент
Полазил где-то еще, решил так:
#include <Windows.h> // в заголовках

// где-то внутри в начале главной функции
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
Ответ написан
@res2001
Developer, ex-admin
Если делать по уму, то вам нужно:
1.Исходники сохранять в UTF8. Для строк и строковых констант использовать wchar_t или wstring.
2.При старте программы узнайте кодировку консоли
3.Перед выводом строк на экран преобразуйте ваши широкие строки в кодировку консоли и только после этого выводите. Для

В винде 2 русских кодировки консоли: cp1251 и cp866, при чем cp866 используется по умолчанию. Менять кодировку консоли можно из самой консоли командой chcp. Менять кодировку консоли из программы - дурной тон.
Пример конвертации с помощью WinAPI можете посмотреть тут.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы