:ストリームから
operator>>
抽出文字をその数に変換してみてください。
- 変換に失敗するため、ストリームの状態を
ios::failbit
に設定して返します。 opt
はおそらく触れられていないでしょう(私は決して本当に理解していないC++のゾーンであるロケールライブラリに標準を委譲しています - 十分な勇気があれば、22.2.2.1.2にあります)。
- 返されているので(おそらく)
opt
がそのまま残っていますが、ループは続行されます。
- 実行が
std::cin >> opt;
に戻ると、operator>>
は状態がまだios::failbit
であると判断し、何も抽出しようとしません。
- 後藤3.
問題を修正するには、エラー状態をきれいにし、入力バッファから「間違った」の文字を削除してください。おそらく、すべてのコードをすべてcin>>
に追加したくないので、この共通の問題に対処する関数を作成すると便利です。個人的に、私は便利な何度も証明しているこの小さなヘッダ(AcquireInput.hpp
)作成:問題はコールstd::cin >> opt
は、(バッファを消費することなく)すぐ文字とリターンを解析するために失敗しているということです
#ifndef ACQUIREINPUT_HPP_INCLUDED
#define ACQUIREINPUT_HPP_INCLUDED
#include <iosfwd>
#include <limits>
#include <string>
template<typename InType> void AcquireInput(std::ostream & Os, std::istream & Is, const std::string & Prompt, const std::string & FailString, InType & Result)
{
do
{
Os<<Prompt.c_str();
if(Is.fail())
{
Is.clear();
Is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
Is>>Result;
if(Is.fail())
Os<<FailString.c_str();
} while(Is.fail());
}
template<typename InType> InType AcquireInput(std::ostream & Os, std::istream & Is, const std::string & Prompt, const std::string & FailString)
{
InType temp;
AcquireInput(Os,Is,Prompt,FailString,temp);
return temp;
}
/* Usage example:
//1st overload
int AnInteger;
AcquireInput(cout,cin,"Please insert an integer: ","Invalid value.\n",AnInteger);
//2nd overload (more convenient, in this case)
int AnInteger=AcquireInput(cout,cin, "Please insert an integer: ","Invalid value.\n");
*/
#endif
あなたは「手紙を渡す」と言うとき、あなたは 'char'を読んでいる意味ですか?または、上記のコードを実行するときに文字を入力することを意味しますか? – marcog
これが役立つかどうかを確認してください。 http://stackoverflow.com/questions/4342068/c-infinite-loop-with-a-simple-menu-selection/4342247#4342247 –
はい、私はcharを読んでいますが、cinはintを待っています –