2016-06-30 4 views
0

私は現在、C++の本を使っています。私は非常に単純な問題で困惑しています。C++ '|'で数字を読み取るwhileループを終了します。

2つの整数を取り入れて出力し、繰り返すプログラムを作成しようとしています。

私が問題になっているのは、プログラムが '|'コンソールに入力されます。

私はこれを試してみた:

数値入力の小さな範囲のために明らかにこれだけ作品

char c; 
int a, b; 
cin >> c; 
a = c; 
if (c == '|') 
    break 
a = c - 48; 
cin >> b; 
b = c; 
if (c == '|') 
    break; 
b = c - 48; 
..... 

(whileループの内側)。多項式の数値を入力して '|'を検出するより良い方法がありますか?入力されましたか?もしこれが基本的だとしたら、静的に型付けされた言語は私の特権ではありません。

+0

私は、あなたの終了条件を変更する必要がありますと思います。すなわち、非数字入力があれば終了する(char、string)。 –

+1

48のようなマジックナンバーは使用しないでください。代わりに '' 0''を使い、移植性と可読性を向上させます。 48は何を知っていますか? ASCII以外のシステムでさえ48でさえありません。しかし彼らはすぐに「0」でそれを知っている –

答えて

0

明白な方法は、でしょうが(読み込もうと、少なくともまたは)ループを使用して、読んだ後BOOLするストリームの変換をテストすることによって、変換を確認する:

int i; 
while (std::cin >> i)   // Try to read a number 
    std::cout << i << "\t"; // if successful, print it out 

if (std::cin.peek == '|')  // check why reading a number failed. 
    // end of input detected 
else 
    // invalid input detected 
0

私が思うに、あなたが変更する必要がありますあなたの終了条件。その場合、終了条件が非数値入力(char、string)であれば、期待どおりの結果を得ることができます(数値入力の整数範囲で動作します)。

場合は、ご理解

について

... 
if (!(cin >> a)) 
{ 
    break; 
} 

if (!(cin >> b)) 
{ 
    break; 
} 
... 
//Uncomment the below two lines if you want to take more input 
//cin.clear(); 
//cin.ignore(std::numeric_limits<int>::max(), '\n'); 

...このように試すことができます(!(CIN >> vaiable))が真である、それはその

a)は意味します入力された値が変数に適合しない

b)変数には影響しません。

c)ストリームがまだ壊れている

d)入力された値はバッファに残り、次の "cin >>変数"ステートメントに使用されます。あなたは、さらに入力を処理したい場合は、次の手順を実行し


A)(cin.clear経由でストリームを修復します)。

b)cin.ignore(std :: numeric_limits :: max()、 '\ n')でバッファをクリアします。

関連する問題