2012-02-08 16 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++の単純なIO母音カウントプログラム

+4

:すべてを行う必要がある。この

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

:これらのステートメントの両方が標準入力から文字を消費します。なぜ 'ch 'で再度読むのでしょうか?また、母音が何であり、母音がいくつあるかを読むこともできます。 – pmr

+1

さらに悪いことに、「文字」を読み込むだけで先頭のスペースもスキップされました! 'cin.get(ch)'のようなものを使いたいだけです。もう一つの問題は、 'toupper()'への引数は正の整数でなければならないが、 'char'には署名できるということです。私の名前はあなたのプログラムをクラッシュさせる可能性があります。あなたは 'toupper(static_cast (ch))'のようなものを使いたいと思っています。 –

+0

'cin >> character'演算子を使うと、文字変数の標準入力から1文字を読み込みます。 'cin.get(ch)'を実行すると、2番目の文字がch変数に読み込まれます。これらの操作のいずれかを実行するだけです。 'cin.get(ch)'行を削除し、 '文字'へのすべての参照を 'ch'に置き換えてみてください。 – mmodahl

答えて

0

変数vowelCountの宣言/初期化が表示されていません。 int変数にはデフォルト値を持っていない、C++では

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

:私はあなただけ宣言(および初期化されていない)、それはのような文を使用していると仮定します。あなたはこのようなコードを書かれている場合は、明示的のようなステートメントを使用して、その値を初期化することによって、それを修正することができます。また

int vowelCount = 0; 

、あなたのループは(2つの文字のうち1をスキップ)各反復で2つの文字を読み取り、あなたが不足しています母音はYです。 PMRのコメントは問題はあなたが各ループ反復で2つの文字で読みますが、最初のものだけをチェックしているということです、を示しているだけのように

//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

修正例は次のようになります。あなたは既にcharacter` `に読んでいる

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

どのように私は空白を読むでしょうか?私は母音を取得した後、私は白いスペースを読んで立ち往生しています。 – user1193717

+0

'cin >> character'は実際に_many_文字を使うことができます。 –