Не воспринимается русский язык 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 шт):
попробуй использовать еще два способа локализации:
напиши
setlocale(LC_ALL, "ru")
в главной функции;подключи
<Windows.h>
, а в главной функции напиши:SetConsoleCP(1251); SetConsoleOutputCP(1251);
есть шанс, что первый способ не поможет, тогда пробуй второй способ.
Как уже указывали, нужно реализовать конвертацию из однобайтных в двухбайтные символы - сначала мы переводим 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);
}