Я написал программу, которая читает ввод слова за раз до тех пор, пока не введется одинокая буква 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’, он завершается, но константы всегда равны 1, а остальные всегда равны 0.
Проблема в том, что std::cin
по умолчанию игнорирует все вкладки и пробелы. Так в вашем коде
if (isspace(ch)) //check if ch is a space
space = true;
никогда не садится space
в true
, Одним из способов избежать этой проблемы является использование std::cin.get(ch)
вместо std::cin>>ch
Предполагая, что вы хотите использовать ту же структуру кода, в цикле while используйте
while (cont && std::cin>> std::noskipws >>ch)
std :: noskipws: изменяет поведение потока cin, чтобы не игнорировать пробелы. Он также добавляет пробел в конце потока. Остерегайтесь конца пространства. К счастью, ваш код обрабатывает пробелы, поэтому вы не увидите его влияния.
Поскольку вы обрабатываете пробелы в коде, это будет работать. Также по умолчанию поведение cin игнорирует пробелы.
Однако я думаю, что вы можете уменьшить сложность кода, и вам может не понадобиться это утверждение
Надеюсь, это поможет вам
#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;
}
Пожалуйста, обратитесь этот за strtok. Это считает все слова, разделенные пробелами или в отдельных строках.