2016-03-02 4 views
-1

Я пытаюсь взять введенную пользователем строку, прокрутить каждый символ внутри строки и затем распечатать только гласные.Чтение символов в строке для вывода только гласных в C++

Я разместил ниже то, что у меня есть до сих пор, но, конечно, все, что он делает, выводит первый символ из строки, независимо от того, является ли он гласным (только FYI, это для класса, поэтому я не ищу кого-то, чтобы дать мне ответ, но я, безусловно, необходимо некоторое руководство!)

#include <iostream> 
#include <cstdlib> 
#include <string> 
#include <iomanip> 

using namespace std; 

int main() 
{ 
    string userString; 
    char vowels = ('a','e','i','o','u'); 
    char stringArr = userString[0]; 

    cout << "Enter some text: "; 
    cin >> userString; 
    cout << endl; 

    if (stringArr == 'a'|'e'|'i'|'o'|'u') 
     cout << userString[0] << " " << endl << endl; 
    else 
     cout << "No vowels found."; 

return 0; 
} 
+0

Это не синтаксис * недействительный *, но он абсолютно неверен и не делает то, что вы думаете. –

+0

Вы не можете комбинировать вещи в 'if', как это. Ваши «гласные» также не делают то, что вы думаете. Проверяйте массивы в любой книге. –

+0

'const char vowels [] = {'a', 'e', ​​'i', 'o', 'u'};' и использовать цикл. –

ответ

0

Во-первых, ваш синтаксис объявления массива неверен.

Поскольку вы используете C++, вы должны использовать встроенный класс array для статических (фиксированных) массивов.

Правильный способ инициализации массива является со следующим синтаксисом:

std::array<char, 5> vowels = { 'a', 'e', 'i', 'o', 'u' }; 

Далее, этот синтаксис также не делать то, что вы думаете, это:

if (stringArr == 'a'|'e'|'i'|'o'|'u') 

| на самом деле является бинарный или, что означает, что он выполняет манипуляции с битами, чего вы не хотите. Кроме того, странно, что вы объявляете гласные, а затем повторно устанавливаете все гласные в этом выражении if. Не повторяйте себя! Используйте список, который вы уже сделали, и выполните поиск. Это делает ваш код намного проще в обслуживании.

Стандартный способ поиска array (и многих других классов контейнеров) заключается в использовании функции find.

c = 'a'; // some character 
find(vowels.begin(), vowels.end(), c) != vowels.end() 

Что это означает, что он будет возвращать true если c находится в vowels.

Теперь нам нужно пройти через все символы строки, введенной пользователем. Для этого вам нужно использовать цикл. В C++ есть что-то, называемое range-based for loop. Синтаксис выглядит следующим образом:

for (auto c : user_string) 
{ 
    // do something with c 
} 

Это будет перебирать целиком строки, и выполнять код внутри блока ({ }) для каждого символа.

Вот рабочий код, который делает именно то, что вы хотите:

#include <iostream> 
#include <cstdlib> 
#include <string> 
#include <iomanip> 
#include <array> 
#include <algorithm> 

using namespace std; 

int main() 
{ 
    bool vowels_found = false; 
    string user_string = "yea man"; 
    array<char, 5> vowels = { 'a', 'e', 'i', 'o', 'u' }; 

    for (auto c : user_string) 
    { 
     if (find(vowels.begin(), vowels.end(), c) != vowels.end()) 
     { 
      cout << c; 

      vowels_found = true; 
     } 
    } 

    if (!vowels_found) 
    { 
     cout << "No vowels found."; 
    } 

    return 0; 
} 
0

Кажется, вы имеете в виду следующее :)

#include <iostream> 
#include <string> 

int main() 
{ 
    while (true) 
    { 
     std::cout << "\nEnter some text (Enter - exit): "; 

     std::string userString; 

     if (!std::getline(std::cin, userString) || userString.empty()) break; 

     const char *vowels = "AaEeIiOoUu"; 

     bool present = false; 

     for (std::string::size_type pos = 0; 
       (pos = userString.find_first_of(vowels, pos)) != std::string::npos; 
       ++pos) 
     { 
      if (!present) present = true; 
      std::cout << userString[pos] << ' '; 
     } 

     if (!present) std::cout << "No vowels found."; 

     std::cout << std::endl; 
    }  

    return 0; 
} 

Выход программы может выглядеть

Enter some text (Enter - exit): Hello World! 
e o o 

Enter some text (Enter - exit): Hll Wrld! 
No vowels found. 

Enter some text (Enter - exit): hEllO wOrld! 
E O O 

Enter some text (Enter - exit): 

Что касается вашего кода, то это не имеет большого смысла.:)

Например, в этой декларации

char vowels = ('a','e','i','o','u'); 

там используется оператор запятой и переменной vowels будет иметь значение 'u'.

Или это заявление

char stringArr = userString[0]; 

инициализирует stringArr с Нуль (при условии, что код компилируется как C++ 2011)

Или условие в, если заявление

if (stringArr == 'a'|'e'|'i'|'o'|'u') 

является всегда принимает значение true, потому что не менее 'e' не равно 0.

Смежные вопросы