У меня в консоль выводятся краказябры. Исправь

#include <iostream>
#include <string>
#include <windows.h>
#include "stdio.h"
#include <clocale>

using namespace std;

struct Rule
{
	string condition; // Условная часть правила
	string action; // Исполняемая часть правила
	bool isActive = true; // Флаг использования правила
};

const char delimiter = ','; // Разделитель для условий "И"
Rule rules[100]; // Массив для хранения правил
string workMemory[100]; // Рабочая память
int factCount = 0; // Количество фактов в памяти
int ruleCount = 0; // Количество правил

string trim(string s) // Удаление пробелов с начала и конца строки
{
	while (!s.empty() && s[0] == ' ')
		s.erase(0, 1);
	while (!s.empty() && s.back() == ' ')
		s.pop_back();
	return s;
}

string extractFact(string& s) // Извлечение факта из строки
{
	string fact;
	int pos = s.find(delimiter);
	if (pos < 0)
	{
		fact = s;
		s.clear();
	}
	else
	{
		fact = s.substr(0, pos);
		s.erase(0, pos + 1);
	}
	return fact;
}

bool isFactPresent(const string& s) // Проверка наличия факта в рабочей памяти
{
	string fact = trim(s);
	for (int i = 0; i < factCount; i++)
		if (workMemory[i] == fact)
			return true;
	return false;
}

void addFact(string fact) // Добавление нового факта в память
{
	fact = trim(fact);
	if (!isFactPresent(fact))
		workMemory[factCount++] = fact;
}

void showFacts() // Вывод фактов, хранящихся в рабочей памяти
{
	cout << "\nСостояние рабочей памяти:\n";
	if (factCount == 0)
		cout << "Рабочая память пуста\n";
	else
	{
		for (int i = 0; i < factCount; i++)
			cout << i + 1 << ". " << workMemory[i] << endl;
	}
	cout << endl;
}

void initializeRules()
{
	// Инициализация правил по условиям задачи
	rules[0] = { "Алеша провожает друга на автобус", "Алеша не на автобусе" };
	rules[1] = { "Мимо них проходит троллейбус", "Алеша не на троллейбусе" };
	rules[2] = { "Алеша не на автобусе, Алеша не на троллейбусе", "Алеша на трамвае" };
	rules[3] = { "Третий друг крикнул из троллейбуса: Боря, ты забыл тетрадь!", "Боря не на троллейбусе" };
	rules[4] = { "Боря не на троллейбусе, Алеша не на троллейбусе", "Витя на троллейбусе" };
	rules[5] = { "Алеша на трамвае, Витя на троллейбусе", "Боря на автобусе" };
	ruleCount = 6;
}

void showRules() // Вывод всех правил
{
	cout << "\nПравила: \n";
	for (int i = 0; i < ruleCount; i++)
	{
		cout << i + 1 << ". ЕСЛИ " << rules[i].condition
			<< " ТО " << rules[i].action << endl;
	}
	cout << endl;
}

bool evaluateCondition(string s) // Проверка истинности условия
{
	while (!s.empty())
	{
		if (!isFactPresent(extractFact(s)))
			return false;
	}
	return true;
}

bool applyRule(int index) // Применение правила по индексу
{
	if (rules[index].isActive && evaluateCondition(rules[index].condition))
	{
		addFact(rules[index].action);
		rules[index].isActive = false;
		return true;
	}
	return false;
}

void performInference() // Механизм прямого логического вывода
{
	initializeRules();
	// Изначальные факты
	addFact("Алеша провожает друга на автобус");
	addFact("Мимо них проходит троллейбус");
	addFact("Третий друг крикнул из троллейбуса: Боря, ты забыл тетрадь!");
	// Прямой вывод
	bool isUpdated;
	do
	{
		isUpdated = false;
		for (int i = 0; i < ruleCount; i++)
			if (applyRule(i))
				isUpdated = true;

	} while (isUpdated);
	showFacts();
	// Итоговое решение
	string alesha, borya, vitya;
	for (int i = 0; i < factCount; i++)
	{
		if (workMemory[i].find("Алеша") != string::npos)
			alesha = workMemory[i];
		else if (workMemory[i].find("Боря") != string::npos)
			borya = workMemory[i];
		else if (workMemory[i].find("Витя") != string::npos)
			vitya = workMemory[i];
	}
	cout << "\nОкончательное решение:\n";
	cout << "Алеша: " << alesha.substr(alesha.find(" ") + 1) << endl;
	cout << "Боря: " << borya.substr(borya.find(" ") + 1) << endl;
	cout << "Витя: " << vitya.substr(vitya.find(" ") + 1) << endl;
}

char showMenu() // Показ меню
{
	char choice;
	cout << "\n Меню:\n";
	cout << "1. Прямой поиск решений\n";
	cout << "2. Выход\n";
	cout << "Выберите пункт меню: ";
	cin >> choice;
	return choice;
}

int main(int argc, char* argv)
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	setlocale(LC_CTYPE, "rus");
	cout << "Решение логической задачи о профессиях и фамилиях\n";
	char choice;
	do
	{
		choice = showMenu();
		if (choice == '1')
			performInference();
	} while (choice != '2');
	system("pause");
	return 0;
}