C/C++

Здравствуйте! Помогите, пожалуйста, с программой С++

У меня есть программа, которая удаляет из строчки, которую ты вводишь, все слова, начинающиеся с согласной буквы, и выводит новую строчку (соответственно, где остались только слова, начинающиеся с гласной буквы) НО программа работает, если вводить строчку на английском языке, и у меня не получается это сделать на русском
#include
#include
#include
#include
using namespace std;
bool is_vowel(char ch) {
if (ch <= 0) return false;
int i = 0, n = 6;
const char* vowel = "aeiouy";
ch = tolower(ch);
do if (ch == vowel[i]) break; while (++i < n);
return i != n;
}
bool is_consonant(char ch) {
return ch > 0 && isalpha(ch) && !is_vowel(ch);
}
string remove_cl(const string& str) {
string tmp;
istringstream iss(str);
string word;
while (iss » word) if (!is_consonant(word.front())) tmp += word + ' ';
tmp.pop_back();
return tmp;
}
int main() {
cout « "String: ";
string str;
getline(cin, str);
str = remove_cl(str);
cout « "New string: " « str « '\n';
system("pause > nul");
return 0;
}
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
bool vowel(char letter) {
if (letter > 0) {
string v = "aeiouy";
letter = tolower(letter);
return v.find(letter) != string::npos;
}
auto v = string("аеиоуыэюяАЕИОУЫЭЮЯёЁ");
return v.find(letter) != string::npos;
}
string convert(const string& line) {
istringstream iss(line);
string word;
string result;
while (iss >> word) if (vowel(word.front())) result += word + ' ';
result.pop_back();
return result;
}
int main() {
system("chcp 1251 > nul");
cout << "Введите строку: ";
string line;
getline(cin, line);
line = convert(line);
cout << "Изменённая строка: " << line << '\n';
system("pause > nul");
}
Андрей Плесак
Андрей Плесак
99 823
Лучший ответ
а ты не делай это на русском
всё, что не входит в стандартный семибитный набор символов ASCII, зависит от используемых кодировок и здорово пердолится, если их попутать

особенно тяжело с этим на шиндоусе, которым ты, судя по pause > nul в конце, пользуешься: там создатели оси умудрились не только забить болт на utf-8, но и сделать в "кириллической" системе сразу три кодировки, так что в одном месте у тебя будет utf16le, в другом cp1251, а в третьем cp866, и стоит тебе, например, написать файл в cp1251, а запустить в консоли с cp866, и все буковки превратятся в кракозябры

если бы ты пользовался системой, которая умеет в utf-8, я бы сказал, что нужно просто отбросить идею "одна буква = один char" и проверять, начинается ли слово со *строки*, представляющей собой гласную букву, т. е. у тебя было бы вместо is_consonant функция starts_with_vowel(const std::string&), у которой внутри было бы что-то вроде static const char* vowels[] = {"u", "U", "я", "Я", ..};

а так могу только посоветовать воспользоваться каким-нибудь виндовым кириллическим костылём типа SetConsoleOutputCP(1251) (за подробностями в гугль) и никому не говорить, что ты пользуешь такую грязюку