2013-08-25 33 views
6

私はC++ Primerの練習をしていますが、基本的にswitch文を使って入力したテキストの母音の数を数えています。charが改行であるかどうかを調べる

whileループを使用してテキストを入力しました。

while(cin >> ch) 

ケースa、e、i、o、uの各ケースについて整数変数をインクリメントします。今度は質問の次の部分でスペース、タブ、改行も数えます。

私は

case ' ': 

をやっなど '\ tの' と '\ n' を使用してみました。しかし、それはこれらのケースを計算しないようです。私はまた、デフォルトを使用し、if elseステートメントを使用してみました。

などですが、これも進行しません。私はまた、 ''、 '\ t'、 '\ n'の整数値を入れてみました。私はここで間違って何をしていますか?また、isspace()を使用すると合計の数を数えることができますが、それぞれを個別に計算する必要があることも知っています。私は平等テストがなぜ仕事をしないのか分かりません。

答えて

12

デフォルトでは、ストリームからの書式付き入力は先頭の空白をスキップします。あなたは、主要な空白の無効化スキップのいずれかにまたはスペースをスキップしないであろう機能のいずれかを使用する必要があります。

std::cin >> std::noskipws; // disables skipping of leading whitespace 
char c; 
while (std::cin.get(c)) { // doesn't skip whitespace anyway 
    ... 
} 
+0

空白を読み取るための簡単な方法はありますか?本書のこの時点で、あなたが言及したテクニックはカバーされていません。よりシンプルなソリューションが必要です。 – Ares

+0

@Comrade: 'std :: getline(std :: cin、str)'を使うことができます。ここで 'str'は' std :: string'です。それはスペースを読み込みますが、改行は 'std :: getline()'の呼び出し成功回数で別々にカウントする必要があります(最後の行が改行で終わっていると間違った結果になるかもしれません)。また、 'std :: istreambuf_iterator 'の 'char'sのシーケンスを反復することもできますが(これはおそらく最も速いアプローチです)、これは本で扱っているとは思えません。 –

+0

母音を数える部分では、小文字と大文字の母音の両方を1つのケースでカウントする必要があります。ですから、私は実際にswitch(tolower(ch))を持っています。 getline(cin、str)をstrが文字列の場合は、文字列に使用できるtolower()と同様の関数がありますか? – Ares

1

ディートマーで言ったように、ホワイトスペースは、デフォルトではスキップされます。 cin.getline()を使用して、空白文字の代わりに独自の文字列区切り文字を指定することができます。私はこれが一般的にcin.get()を使用するのに比べて入力を読む方が簡単だと言います。

関連する問題