2012-02-08 2 views
1
char ch; 
//Get data from user 
cout << "Enter your sentence on one line followed by a # to end it: " << endl; 

while (cin >> character && character != '#') 
{ 
    cin.get(ch); 
    ch = static_cast<char>(toupper(ch)); 
    outFile << ch; 

    if (character == 'A' || character == 'E' || character == 'I' || character == 'O' 
       || character == 'U') 
    { 
     vowelCount ++; 

    } 
} 
outFile << "number of vowels: " << vowelCount << endl; 

Я пытаюсь ввести предложение, прочитать, сколько гласных, пробелов и других символов у него есть. Но vowelCount никогда не прав, и я не могу заставить его написать одно и то же предложение в выходной файл. Любые намеки?C++ simple IO vowel count program

+4

Вы уже читаете в 'character'. Зачем читать снова в 'ch'? Кроме того, вам, возможно, захочется прочитать, что такое гласный и сколько есть. – pmr

+1

хуже, тем не менее, чтение в 'character' просто пропустило пробелы! Вы только хотите использовать что-то вроде 'cin.get (ch)'. Другая проблема заключается в том, что аргумент 'toupper()' должен быть положительным целым числом, но 'char' может быть подписан в том случае, например. мое имя может привести к краху вашей программы. Вы хотите использовать что-то вроде 'toupper (static_cast (ch))'. –

+0

Использование оператора 'cin >> character' считывает один символ из стандартного ввода в символьную переменную. Выполнение 'cin.get (ch)' читает второй символ в переменной ch. Вам нужно только выполнить одну из этих операций. Удалите строку 'cin.get (ch)' и попробуйте заменить все ссылки на 'character' на' ch'. – mmodahl

ответ

0

Вы не указали декларацию/инициализацию переменной vowelCount. Я предполагаю, что вы только декларировали (и не инициализированы), то с помощью инструкции, как:

int vowelCount; // notice the variable is not initialized. 

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

int vowelCount = 0; 

Кроме того, ваши петли читает 2 символа на каждой итерации (пропуск одного из двух персонажей) и вам не хватает гласный Y.

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

//Get data from user 
cout << "Enter your sentence on one line followed by a # to end it: " << endl; 

int vowelCount = 0; 
while (cin >> character && character != '#') 
{ 
    character = toupper(character); 

    if (character == 'A' || character == 'E' || character == 'I' || character == 'O' 
       || character == 'U' || character == 'Y') 
    { 
     vowelCount ++; 

    } 
} 
outFile << "number of vowels: " << vowelCount << endl; 
+0

Это немного вводит в заблуждение, учитывая, что его следующей задачей является подсчет пробелов. –

+0

OP может использовать отключить/разрешить пропуски пробелов с помощью манипуляторов ['cin >> noskipws' и' cin >> skipws'] (http://en.cppreference.com/w/cpp/io/manip/skipws) или вместо этого может использовать синтаксис 'while (cin.get (character)). –

+0

Из Wiki: в письменных системах, основанных на латинском алфавите, буквы A, E, I, O, U, а иногда и Y используются для обозначения гласных. «Y» может быть необязательным для его домашней работы. –

0

Так же, как комментарий ПМР показывает, что проблема в том, что вы читаете в двух символов с каждой итерации цикла, но только проверка первый. Оба эти утверждения потребляют символ из стандартного ввода:

cin >> character 
... 
cin.get(ch) 

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

while (cin >> character && character != '#') 
{ 
    character = static_cast<char>(toupper(character)); 
+0

Как бы я прочитал пробелы? как только я получил гласные, я застрял в чтении белых пространств. – user1193717

+0

'cin >> character' может на самом деле потреблять _many_ символов. –