Странный вывод русских букв на консоль с setlocale
Помогите, пожалуйста исправить вывод.
Что вообще нужно было сделать:
- Создать структуру Hotel, содержащую следующие данные: ФИО туриста, дату прибытия, количество дней пребывания в отеле.
- Определить людей, находящихся в отеле в заданный день.
- Необходимо проверить корректность ввода дат.
Принцип моего решения: после ввода данных я работаю со схемой ниже.

Код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
struct Hotel
{
string lastname;
string name;
string otchestvo;
int day; //день заеда
int month; //месяц заеда
int year; //год заезда
int days; //на сколько дней
};
//счетчик дней
int countday(int day1, int month1, int year1, int day2, int month2, int year2)
{
int sum1 = 0, sum2 = 0, count = 0;
int mon[12] = { 31, 30, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//Part 1
for (int i = 0; i < (year1 - 1); i++)
{
if (i % 4 != 0)
{
sum1 += 365;
}
else
{
sum1 += 366;
}
}
for (int j = 0; j < (month1 - 1); j++)
{
sum1 += mon[j];
}
if (year1 % 4 != 0)
{
sum1 += day1;
}
else if ((year1 % 4 == 0) && (month1 > 2))
{
sum1 += (day1 + 1);
}
else
{
sum1 += day1;
}
//Part 2
for (int i = 0; i < (year2 - 1); i++)
{
if (i % 4 != 0)
{
sum2 += 365;
}
else
{
sum2 += 366;
}
}
for (int j = 0; j < (month2 - 1); j++)
{
sum2 += mon[j];
}
if (year2 % 4 != 0)
{
sum2 += day2;
}
else if ((year2 % 4 == 0) && (month2 > 2))
{
sum2 += (day2 + 1);
}
else
{
sum2 += day2;
}
return sum2 - sum1;
}
int main()
{
setlocale(LC_ALL, "ru");
int numberPeople;
vector<Hotel> v;
Hotel People; //объявление
cout << "Сколько всего людей в отеле? Ответ: ";
cin >> numberPeople;
for (int i = 0; i < numberPeople; i++) { //заполнение
v.push_back(People);
cout << "Введите ФИО человека " << i+1 << ": ";
cin >> v.at(i).lastname;
cin >> v.at(i).name;
cin >> v.at(i).otchestvo;
//дата начальная -> дата конечная
cout << "Введите дату прибытия цифрами в формате ДД ММ ГГГГ: ";
cin >> v.at(i).day;
cin >> v.at(i).month;
cin >> v.at(i).year;
cout << "Введите количество дней его прибывания: ";
cin >> v.at(i).days;
}
int date_d, date_m, date_y;
cout << "Введите необходимую дату в формате ДД ММ ГГГГ: ";
cin >> date_d >> date_m >> date_y;
int count = 0; //счетчик людей, которые жили в отеле в определенный день
vector<string> people;
for (int i = 0; i < numberPeople; i++) { //заполнение
int maybe = countday(v.at(i).day, v.at(i).month, v.at(i).year, date_d, date_m, date_y);
if (maybe <= v.at(i).days)
if (v.at(i).month <= date_m)
{
people.push_back(v.at(i).lastname);
count++;
}
}
cout << "На момент " << date_d << '.' << date_m << '.' << date_y << " в отеле проживали "<< ':' << endl;
for (int i = 0; i < count; i++)
{
cout << people[i] << endl;
}
system("pause");
return 0;
}
Ответы (1 шт):
Автор решения: Павел Ериков
→ Ссылка
Лучше вместо setlocale писать так:
SetConsoleCP(1251); //устанавливаем кодировку для ввода
SetConsoleOutputCP(1251); //для вывода
Поподробней прочитать про функции можете тут и тут. А подробное объяснение в целом про работу с не латинскими символами в консоли тут

