0

私は運が悪いので、一日中これに取り組んできました。今は夜で、何をすべきかわかりません。私の課題は、ユーザーが入力した文の母音の数、空白の数、およびその他の文字の数を読み取ることです。空白に cin.get(ch) を使用する必要があることは知っていますが、方法がわかりません。また、文をファイルに出力する必要があります。私がこれまでに持っているものは次のとおりです。

//Get data from user 
cout << "Enter your sentence on one line followed by a # to end it: " << endl;



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

    if (character == 'A' || character == 'E' || character == 'I' ||
            character == 'O' ||  character == 'U')
    {
        vowelCount++;
        isVowel = true;

    }

    if (isspace(character))
    {
        whiteSpace++;

    }

    else if (isVowel == true && isspace(character))
    {
        otherChars++;
    }

    outFile << character;

}


outFile << "vowelCount: " << vowelCount << endl;
outFile << "whiteSpace: " << whiteSpace << endl;
outFile << "otherchars: " << otherChars << endl;
4

4 に答える 4

3

この行

if (character == 'A' || 'E' || 'I' || 'O' || 'U');

あなたが思うことをしていません。常に true を返します。

あなたが必要

if (character == 'A' || character == 'E' || character == 'I' || character == 'O' || character =='U')

その行の最後にあるセミコロンも削除します

于 2012-02-08T03:10:35.320 に答える
1

ここ:

while (cin >> character && character != '#')

すべての空白をスキップしています。演算子 >> が空白をスキップしないようにするには、noskipws 修飾子を使用してこれを明示的に指定する必要があります。

while(std::cin >> std::noskipws >> character && character != '#')

別の方法として、get を使用して同じ効果を得ることができます。

while(std::cin.get(character) && character != '#')

次に、ループ条件の外でさらに文字を読み取ります。

cin.get(character);

変数 'c​​haracter' には既に値があります。というわけで両方とも外します。ループの次の反復 (while 条件内) は、次の文字を取得します (ループに入る前に実行されるため)。

次に、Tim が指摘したようにテストを修正します。
次に、空白の別のテストを次のように追加できます。

if (std::isspace(character)) // Note #include <cctype> 
{  /* STUFF */ }
于 2012-02-08T03:14:22.243 に答える
0

まったく同じ方法で空白をチェックできます。一般的な空白文字は、スペース ( ' ') と水平タブ ( '\t') です。あまり一般的ではないのは、改行 ( '\n')、キャリッジ リターン ( '\r')、フォーム フィード ( '\f')、および垂直タブ ( '\v') です。

isspaceからもご利用いただけますctype.h

于 2012-02-08T03:20:46.170 に答える