get()メソッドは '\ n'文字まで読み込みますが、それを抽出しません。 122345<enter>
このライン:
あなたが入力している場合
cin.get(s1,19);
12345
を読みますが、しかし(<が>を入力して押すことによって作成された)は '\ n' が入力ストリームに残されています。したがって、次の行は次のようになります。
cin.get(s2,9);
「\ n」が表示されて停止するため、何も表示されません。しかし、 '\ n'も抽出しません。したがって、入力ストリームにはまだ '\ n'があります。だからこの行:
getch();
ちょうど入力ストリームから '\ n'文字を読み取ります。その後、処理を終了してプログラムを正常に終了させることができます。
OK。それが起こっていることです。しかし、これ以上のことがあります。書式付き入力を読み込むにはget()を使用しないでください。フォーマットされたデータを正しいタイプに読み込むには、演算子>>を使用します。
int main()
{
int x;
std::cin >> x; // Reads a number into x
// error if the input stream does not contain a number.
}
のstd :: cinをあなたは<は>を入力して、ストリームのフラッシュ押すまで、データがプログラムに送られていないバッファされたストリームであるため。したがって、一度に1行のテキストを(ユーザー入力から)読み込んでから、その行を個別に解析すると便利なことがよくあります。これにより、エラーの最後のユーザー入力を確認することができます(行単位で行をベースにし、エラーがあればそれを拒否します)。
int main()
{
bool inputGood = false;
do
{
std::string line;
std::getline(std::cin, line); // Read a user line (throws away the '\n')
std::stringstream data(line);
int x;
data >> x; // Reads an integer from your line.
// If the input is not a number then data is set
// into error mode (note the std::cin as in example
// one above).
inputGood = data.good();
}
while(!inputGood); // Force user to do input again if there was an error.
}
さらに進歩したければ、さらにブーストライブラリを見ることもできます。彼らは一般的に良いコードを提供し、C++プログラムとしてはboostの内容を知っておくべきです。あなたは次の入力を取得する前に、ストリームから改行文字を無視するcin.ignore();
を使用する必要が
int main()
{
bool inputGood = false;
do
{
try
{
std::string line;
std::getline(std::cin, line); // Read a user line (throws away the '\n')
int x = boost::lexical_cast<int>(line);
inputGood = true; // If we get here then lexical_cast worked.
}
catch(...) { /* Throw away the lexical_cast exception. Thus forcing a loop */ }
}
while(!inputGood); // Force user to do input again if there was an error.
}
「プログラムから飛び出している」とはどういう意味ですか?つまり、あなたはopn s1とs2のものを入力しないということですか? – Muggen
最初に、 '' stdafx.h ''や' _tmain'のような、C++の悪い拡張機能を使用するのはなぜですか? –
Dude。あなたは確かにそれをコンパイルしますか?それは私のVS2008ではありません。 getch()には何を含めるのですか? – Muggen