2012-03-09 2 views
0
#include<iostream> 
#include<cstdio> 
using namespace std; 

int main() 
{ 

    char str[80]; 
    int i=0; 
    cout<<"Enter the String "; 
    gets(str); 
    for (int j=0;str[j]!='\0';j++) 
    if (str[i]=='A'||'E'||'I'||'O'||'U') 
    i++; 
    cout<<"Number of vowels is: "<<i; 



} 

Здесь я проверяю элемент в String for Vowel, может ли кто-нибудь предложить альтернативный метод для этого? Мне нужно подсчитать количество гласных в строке.Тестирование индекса строкового массива в C++?

Этот код работает идеально для меня, просто нужно найти альтернативный метод, когда мне не нужно набирать слишком много «||» и 'a' и 'A' по-разному.

+1

Не работает ли он? У вас есть проблемы? ошибка? – talnicolas

+1

Я бы предложил метод, который также учитывает строчные гласные. О, и используйте 'str [j]'. –

+0

@talnicolas Нет, это не работает. Я считаю 3 реальных ошибки, несколько потенциальных проблем и ряд более мелких проблем, таких как смешивание C с C++, отсутствие оператора возврата и т. Д. –

ответ

5
if (str[i]=='A'||'E'||'I'||'O'||'U') 

это неправильно

должно быть так:

if(str[i]=='A' || str[i]=='E'||str[i]=='I'||str[i]=='O'||str[i]=='U') 

, а также заботиться о случае чуткости

4
str[i]=='A'||'E'||'I'||'O'||'U' 

всегда возвращает истину, потому что 'E' всегда верно. Вы ищете

strchr("AEIOU", str[j]) 

Обратите внимание на j, вы получили переменную неправильно цикла.

(Кроме того, в C++, вы будете хотеть использовать iostreams и getline вместо cstdio и fgets.)

+0

Почему «E» всегда верно? Пожалуйста, бросьте на него какой-то свет. –

+0

@LaimeNekurzeme: '' E'' не равно нулю, и любое ненулевое значение считается истинным в булевом контексте. –

+0

Если «E» не равен нулю, как я могу проверить гласную? Я не использую его в контексте для любого Boolean. Я использую его для проверки символа в строке. –

-2

путь? или синтаксис?

я думаю, что его ошибка синтаксиса .. она должна быть как

if(str[i]=='A' || str[i]=='E'||str[i]=='I'||str[i]=='O'||str[i]=='U')

Если вы спрашиваете о лучшем способе, я не думаю, что есть какие-либо .. Вы делаете в O (n) сложность, которая достаточно хороша, я думаю.! Даже если вы используете хэширование, вы будете иметь хэш всех п символов в строке ..

+0

-1: хеширование в этом контексте не имеет значения – perreal

2

Более C++ - иш решения:

std::string vowels("aAeEiIoOuU"); 
for (int j=0;str[j]!='\0';j++) 
{ 
    if (vowels.find(str[j]) != std::string::npos) 
    i++; 
} 
+0

Ваше решение имеет ту же ошибку, что и оригинал! –

+0

Все еще не совсем нормально. –

+0

'str [i]' должно быть 'str [j]' в условии цикла. –

0

Или используйте таблицу:

#include <iostream> 
#include <string> 

int main() 
{ 
    char list_v[256] = { 0 }; 
    list_v['a'] = list_v['e'] = list_v['i'] = list_v['o'] = list_v['u'] = 1; 
    list_v['A'] = list_v['E'] = list_v['I'] = list_v['O'] = list_v['U'] = 1; 
    std::string str = "a sentence here"; 
    uint32_t cnt = 0; 
    for (uint32_t i = 0; i < str.length(); i++) 
    cnt += list_v[str[i]]; 
    std::cout << "found " << cnt << std::endl; 
    return 0; 
} 

или используйте карту с той же целью или C++ array/vector, людям не нравятся c массивы здесь. Конечно, это работает только для ASCII.

+0

Это хорошо, только если частота вашего процессора примерно такая же, как и доступ к памяти. В противном случае он медленный, как дерьмо, когда данные не находятся в кэше ЦП при вызове функции. Таблица поиска хороша только в том случае, если компромиссы являются альтернативными реализациями, они занимают больше времени, чем латентность доступа к памяти ... Так что вообще - избегайте использования таблиц поиска, если это необходимо. –

1
inline bool is_vowel(char a) 
{ 
    a=std::tolower(a); 
    switch(a) 
    { 
    case 'a':  case 'e': 
    case 'i':  case 'o': 
    case 'u': 
     return true; 
    } 
    return false; 
} 

int main() 
{ 
    std::string line; 
    std::cout << "enter text" << std::endl; 
    std::getline(std::cin, line); 
    int vowel=std::count_if(line.begin(), line.end(), is_vowel); 
    std::cout << "Number of vowels: " << vowel << std::endl; 
} 
+0

+1 Я как раз собирался публиковать использование 'std :: count_if()', как никогда не заметили, что вы его использовали. – hmjd

+0

yep count_if действительно тоже подходит для работы здесь, мой предикат может быть улучшен, я думаю, но это чертовски зрелище лучше, чем циклы и другие C, такие как хаки, перечисленные – 111111