無限ループを作成します。
while (text != '\n') {
...
}
text'\n' 以外の何かが発生した場合 (文字の誤称のように) は永遠に続きます。一般的なガイドラインとして、ループを作成するときはいつでも、ループの本体が何らかの形でループの終わりに向かって進行し、ループの終わりに到達したことを確認する必要があります (もちろん、無限ループを作成するつもりがない場合)。 lop) おそらく、これを取り除きwhile (...)、本体だけを保持したいだけでしょう。
外側のループには、終了する 2 つの条件が必要であることに注意してください。
- 行の終わりに到達すると、終了する必要があります。
- 入力の最後に到達すると終了する必要があります。これは必ずしも改行で終了するとは限りません。
ループを書くとしたら、次のようになります。
for (std::istreambuf_iterator<char> it(std::cin), end; it != end && *it != '\n'; ++it) {
// do something with the `char` obtained from `*it`
}
islower()正の値が(または の他の関数のいずれか) に渡されることを確認する必要があることも注目に値し<cctype>ます。を呼び出したときの未定義の動作。この問題を回避する方法は、関数に渡す前に をに変換することです。 のビット パターンは のビット パターンと同じです(が 型であると仮定します)。charüislower('ü')charunsigned char<cctype>static_cast<unsigned char>(c)ccchar
whilea を読み取る -loopの元のアプローチに固執するとchar、基本的なループは次のようになります。
while (std::cin.get(text) && text != '\n') {
if (std::islower(std::static_cast<unsigned char>(text))) {
++count;
}
}
一般に、do ... while-loops が実稼働コードに残ることはめったになく、これも例外ではありませんchar。正常に読み取れる場合にのみ、ループに入ります。改行は小文字にならないので、条件に直接入れることもできます。ASCII 文字は機能しますが、コードを確実にするために、壊れないようにstd::islower(text)キャストを追加しました。unsigned char最後に、変数をインクリメントするための C++ のイディオムは、皮肉なことに、プリインクリメント++countですcount++。主な用途は、プリインクリメントが適用される型が完全に自明でない場合に、プリインクリメントがより効率的であることです。C++ はインクリメントされる多くの反復子を使用するため、プリインクリメントを使用するのが一般的です。