2012-03-09 16 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; 



} 

ここで私はVowelのStringの要素をチェックしていますが、誰でもこの代替方法を提案できますか?私は文字列中の母音の数を数える必要があります。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') 

ともケースの世話を'E'は常にtrueであるため

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

は常に、trueを返します敏感。あなたは探しています

strchr("AEIOU", str[j]) 

あなたはループ変数が間違っていることに注意してください。

(また、C++で、あなたの代わりにcstdiofgetsiostreamsgetlineを使用することをお勧めします。)

+0

「E」はいつも本当ですか?それに光を投げてください。 –

+0

@LaimeNekurzeme: ''E 'はゼロではなく、ブール値のコンテキストではゼロ以外の値はtrueとみなされます。 –

+0

'E'がゼロでない場合、どうすれば母音をテストできますか?私は、ブール値との関連でそれを使用していません。私はそれを文字列の文字をテストするために使用しています。 –

-2

ウェイ?または構文?

私は...それはあなたがより良い方法について尋ねている場合は、私はすべてのがあると思いません

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

ようにする必要があり、その構文エラーだと思います..あなたはOでやっている (n)複雑さ、それは十分に私が推測する良いです!あなたはハッシュを使用する場合でも、あなたは、文字列内のすべての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++の配列/ベクトルでは、人々はここでc配列を好きではありません。これは当然ASCIIのためだけに機能します。

+0

これは、CPUの頻度がメモリアクセスとほぼ同じ場合にのみ有効です。さもなければ、関数を呼び出すと、データがCPUキャッシュにないとうまくいかないので遅くなります。ルックアップテーブルは、トレードオフが代替実装の場合、メモリアクセスレイテンシよりも長い時間がかかる場合にのみ有効です...一般的に、必要な場合以外はルックアップテーブルを使用しないでください。 –

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