Не работает подсчет слов в тексте (C++)

268
27 ноября 2017, 19:00

Доброго времени суток. Есть следующая задача: С клавиатуры вводится текстовая строка. Разработать программу, которая реализует указанные действия. а) подсчитывает количество слов в тексте, которые заканчиваются на гласную букву; б) выводит на экран все слова, длина которых меньше пяти символов; в) удаляет все слова, которые содержат хотя бы одну латинскую букву. Ниже представлен мой код, в котором не работает только первый пункт задания. И я не могу понять почему/зачем он не хочет работать. Прошу помощи)

#include <iostream>
#include <sstream>
#include <string>
#include <stdlib.h>
#include <vector>
#include <locale.h>
#include <windows.h>
bool IsVowel(char c)
{
switch(c)
{
    case 'e':
    case 'y':
    case 'u':
    case 'i':
    case 'o':
    case 'a': 
    case 'у':
    case 'ы':
    case 'а':
    case 'о':
    case 'э':
    case 'я':
    case 'и':
    case 'ю':
    case 'ё':
    case 'е':
        return true;
    default:
        return false;
}
}
int main()
{
std::string str, word;
std::getline(std::cin, str);
char* lpBuff = new char[str.size() + 7];
OemToCharA(str.data(), lpBuff);
str = lpBuff;
std::istringstream iss(str);
int iVowel = 0;
std::vector<std::string> v;
std::string strwolatin = "";
while(!iss.eof())
{
    iss >> word;
    if(IsVowel(word[word.size()])) iVowel++;
    if(word.size() < 5) v.push_back(word);
    for(size_t i = 0; i < word.size(); i++)
    {
        if(word[i] >= 'a' && word[i] <= 'z') goto l1;
        if(word[i] >= 'A' && word[i] <= 'Z') goto l1;
    }
    strwolatin += word + " ";
    l1:;
}
std::cout << "The number of words in the text that end with a vowel letter: " << iVowel << std::endl;
std::cout << "All words that are less than 5 characters in length:" << std::endl;
for(size_t i = 0; i < v.size(); i++) std::cout << "  " << v[i] << std::endl;
std::cout << "Text without words that have at least 1 Latin letter: " << strwolatin << std::endl;
return 0;
}
Answer 1

Возможно дело в кодировке русских букв. Ваш файл с исходным кодом в юникоде (например) и строка вида case 'a': вообще не имеет смысла, а с клавиатуры вводите в cp1251 (например).

READ ALSO
Проверка типов в конструкторе с std::forward

Проверка типов в конструкторе с std::forward

Вопрос: нужно ли проверять типы T1, T2, T3 в конструкторе? Я так полагаю, что нужно, потому что этот конструктор запросто съедает, например, в качестве...

254
Не виден MessageBox

Не виден MessageBox

В общем, дело такое, есть класс окна, который хорошо себя показывает, обработка внутренних сообщений, отрисовки, ресайза, и тд

313
Вывод объема оперативной памяти

Вывод объема оперативной памяти

Здравствуйте! Есть задание вывести общий объём физической памяти и свободный объём физической памяти в МбИспользую структуру MEMORYSTATUS из библиотеки...

298
синглтон майерса и многопоточность

синглтон майерса и многопоточность

здравствуйте, не раз слышал фразу, что "после c++11 синглтон майерса стал потокобезопасным"

263