Странный вывод русских букв на консоль с 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); //для вывода

Поподробней прочитать про функции можете тут и тут. А подробное объяснение в целом про работу с не латинскими символами в консоли тут

→ Ссылка