無限ループを作成します。
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('ü')
char
unsigned char
<cctype>
static_cast<unsigned char>(c)
c
c
char
while
a を読み取る -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++ はインクリメントされる多くの反復子を使用するため、プリインクリメントを使用するのが一般的です。