Не воспринимается русский язык c++

Дана строка. Слово есть любая последовательность букв, разделенных пробелом. Удалить в этой строке все слова, начинающиеся на заданную букву без учета регистра этой буквы. Ввод: "Вас встретил я случайно", 'в' Вывод: "я случайно"

Проблема такова, при вводе на английском языке все работает отлично, но при вводе на русском языке ничего не выводиться. Предполагаю, что проблема в кодировке, но я установил setlocale..

#include <iostream>
#include <string>
#include <locale> // Добавляем заголовок для std::locale

using namespace std;

bool isLetter(char c) {
    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}

int countWords(const std::string& sentence) {
    int wordCount = 0;
    bool inWord = false;

    for (size_t i = 0; i < sentence.length(); ++i) {
        char c = sentence[i];

        if (isalpha(c)) {
            if (!inWord) {
                inWord = true;
                wordCount++;
            }
        } else {
            inWord = false;
        }
    }

    return wordCount;
}

void removeCharWords(string &input, const string& letter) {
    string result;
    string word;
    bool skipWord = false;

    for (char c : input) {
        if (c == ' ') {
            if (!skipWord) {
                result += word + ' ';
            }
            word.clear();
            skipWord = false;
        } else {
            word += c;
            if (tolower(c) == tolower(letter[0])) {
                skipWord = true;
            }
        }
    }

    if (!skipWord) {
        result += word + ' ';
    }

    input = result;
}

int main() {
    // Используем std::locale для установки русской локали
    locale::global(locale("ru_RU.UTF-8"));
    
    string input;
    string singleChar;
    bool flagIn = true;

    cout << "Введите строку:" << endl;
    getline(cin,input);
    cout << "Введите символ:" << endl;
    cin  >> singleChar;

    cout << "Изначальная строка: "<< input << endl;
    removeCharWords(input, singleChar);
    cout << "Итоговая строка: "<< input << endl;
}





Ответы (2 шт):

Автор решения: ScorLenty

попробуй использовать еще два способа локализации:

  1. напиши setlocale(LC_ALL, "ru") в главной функции;

  2. подключи <Windows.h>, а в главной функции напиши:

    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    

есть шанс, что первый способ не поможет, тогда пробуй второй способ.

→ Ссылка
Автор решения: schmidt9

Как уже указывали, нужно реализовать конвертацию из однобайтных в двухбайтные символы - сначала мы переводим string в wstring, а потом на выходе наоборот

void removeCharWords(string &input, const string& letter) {
    wstring result;
    wstring word;
    bool skipWord = false;
    
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> convertToUtf16;
    auto utf16Input = convertToUtf16.from_bytes(input.data());
    auto utf16Letter = convertToUtf16.from_bytes(letter.data());
    
    auto const &facet = std::use_facet<std::ctype<wchar_t>>(std::locale());
    
    for (char16_t c : utf16Input) {
        if (c == ' ') {
            if (!skipWord) {
                result += word + L' ';
            }
            word.clear();
            skipWord = false;
        } else {
            word += c;
            if (facet.tolower(c) == facet.tolower(utf16Letter[0])) {
                skipWord = true;
            }
        }
    }

    if (!skipWord) {
        result += word + L' ';
    }
    
    std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> convertToUtf8;

    input = convertToUtf8.to_bytes(result);
}
→ Ссылка