2013-07-28 4 views
0

Я написал программу, которая читает ввод слова одновременно, пока не будет введен одиночный «q». Затем программа сообщит о количестве слов, которые начинались с гласных, числа, которое начиналось с согласных, и число, которое не соответствует ни одной из этих категорий.нужна помощь отладка ввода символов

#include <iostream> 
#include <cstdlib> 

int main() 
{ 
char ch; 
bool cont = true; //for controlling the loop 
bool space = false; //see if there is a space in the input 
    int i = 0; //checking if the input is the first word 
int consta, vowel, others; 
consta = vowel = others = 0; 
std::cout<<"Enter words (q to quit)\n"; 

while (cont && std::cin>>ch) //continue while cont is true and the input succeded 
{ 
    if (i == 0) //check if this is the first word 
    { 
     if (isalpha(ch)) 
      if ((ch == 'a' ||ch == 'e' ||ch== 'i' ||ch== 'o' ||ch== 'u') || (ch == 'A' ||ch== 'E' ||ch== 'I' ||ch== 'O' ||ch== 'U')) 
       ++vowel; 
      else 
       ++consta; 
     else 
      ++others; 
     ++i; //add 1 to i so this if statement wont run again 
    } 


    if (space == true) //check if the last input was a space 
    { 
     if (!isspace(ch)) //check if the current input is not a space 
     { 
     if (ch != 'q') //and ch is not 'q' 
     { 
     if (isalpha(ch)) 
      if ((ch == 'a' ||ch == 'e' ||ch== 'i' ||ch== 'o' ||ch== 'u') || (ch == 'A' ||ch== 'E' ||ch== 'I' ||ch== 'O' ||ch== 'U')) 
       ++vowel; 
      else 
       ++consta; 
     else 
      ++others; 

     space = false; 
     } 

     } 
     else 
      cont = false; 
    } 
    if (isspace(ch)) //check if ch is a space 
     space = true; 
} 

std::cout<<"\n"<<consta<<" words beginnig with constants\n"; 
std::cout<<vowel<<" words beginnig with vowels\n"; 
std::cout<<others<<" words beginning with others\n"; 

system("pause"); 
return 0; 
} 

Но это не заканчивается, когда я ввожу пробел и «q». Но если я в положить «^ Z» это прекратить, но constantans всегда 1, а остальные всегда 0.

+0

Пожалуйста, взгляните на мое решение – Saksham

+0

. Что-то не так с моим решением. По крайней мере, комментарий был бы оценен за то, что он даже не поддержал мой ответ – Saksham

ответ

1

Проблема заключается в том, что std::cin по умолчанию игнорирует все вкладки и пробелы. Так что в вашем коде

if (isspace(ch)) //check if ch is a space 
    space = true; 

никогда не заходит space к true. Один из способов избежать этой проблемы - использовать std::cin.get(ch) вместо std::cin>>ch

0

Надеется, что это поможет вам

#include<iostream> 
#include<cstdlib> 
#include<string> 
int main() 
{ 
    char ch[50]; 
    int consta, vowel, others; 
    consta = vowel = others = 0; 
    bool flag = false; 
    std::cout<<"Enter words (q to quit)\n"; 
    while(1) 
    { 
     if(flag == true) 
     { 
      break; 
     } 
     gets(ch); 
     char* pch; 
     pch = strtok(ch," "); 
     if(strcmp("q",pch)==0) 
     { 
      break; 
     } 
     while (pch != NULL) 
     { 
      if(strcmp("q",pch)==0) 
      { 
       flag = true; 
       break; 
      } 
      if(isalpha(pch[0])) 
      { 
       if ((pch[0] == 'a' ||pch[0] == 'e' ||pch[0]== 'i' ||pch[0]== 'o' ||pch[0]== 'u') || (pch[0] == 'A' ||pch[0]== 'E' ||pch[0]== 'I' ||pch[0]== 'O' ||pch[0]== 'U')) 
        ++vowel; 
       else 
        ++consta; 
      } 
      else 
       ++others; 
      pch = strtok (NULL, " "); 
     } 
    } 
    std::cout<<"\n"<<consta<<" words beginnig with constants\n"; 
    std::cout<<vowel<<" words beginnig with vowels\n"; 
    std::cout<<others<<" words beginning with others\n"; 
    std::cin.ignore(); 
    return 0; 
} 

Пожалуйста, обратитесь this для strtok. Это учитывает все слова, разделенные пробелами или отдельными строками.

0

Предполагая, что вы хотите использовать ту же структуру кода При использовании петлевой в то время как

while (cont && std::cin>> std::noskipws >>ch) 

STD :: noskipws: изменяет поведение потока CIN, чтобы не игнорировать пробелы. Он также добавляет пространство в конце потока. Остерегайтесь конечного пространства. К счастью, ваш код обрабатывает пробелы, поэтому вы не увидите его влияния.

Поскольку вы обрабатываете пробелы в коде, это будет работать. Кроме того, по умолчанию поведение cin заключается в игнорировании пробелов.

Однако я думаю, что вы можете уменьшить сложность кода и вы не можете это заявление

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