0

「std::cin >>」を使用して値を入力中にエラーが発生した後も、引き続き入力を使用できるようにしたいと考えています。

たとえば、整数変数に文字を入れた後、cin 関数を使用するソース内の他のすべてのステートメントが機能しなくなります。

エラーを作成した後、cin を使用し続けることはできますか?

#include <iostream>
using namespace std;


int addition(){
int sum = 0, val = 0;
while(cin >> val){
sum += val;
}

return sum;
}

int multiplication(){
int x = 0, y = 0;
cin >> y;
x = y;
while(cin >> y){
x = x * y;
}

return x;
}


int main()
{

int x = addition();
int y = multiplication();

return 0;
}
4

2 に答える 2

3

整数を読み込もうとして「数字以外」の文字を取得したためにエラーが発生した場合は、 を使用cin.clear()してエラーをクリアしてから、cin.get()または同様に問題のある文字を削除する必要があります。を受け取った場合end-of-file、それはいくつかの実装で「くっつく」傾向があるため、はるかに困難です。したがって、基本的に、ファイルの終わりに到達すると、本当に厄介なフープをジャンプしない限り、ゲームオーバーになります(独自の書き込みstreambufは1つの解決策になるかもしれませんが、それはあなたの目に真っ赤な針を突き刺すのと同じくらい楽しいです.

文字列を読み取ってから数値に変換しようとする、一度に文字を読み取って独自の翻訳を行う、または翻訳する既製のライブラリを使用するなど、多くの代替ソリューションがあります。これらのどれも、ユーザーが「ファイルの終わり」キー (Windows では CTRL-Z やその他のいくつかでは CTRL-Z、Linux/Unix/MacOS X などでは CTRL-D など - MacOS については不明) を押した場合に続行できることを保証していません。 X の前ですが、まだ気にする人はいますか?)

于 2013-07-08T22:00:36.187 に答える
0

文字を読み上げて、もう一度やり直す必要があります。

while( !(cin >> y) && !cin.eof() )
{
    cin.get();  // Skip invalid character
}

これは少し珍しいです。私たちが通常期待するのは、エラーを出力することです。プロンプトで値が入力されている場合は、getline代わりに使用して結果を解析する傾向があります。

while(1)
{
    string line;
    if( getline(cin, line) )
    {
        istringstream iss(line);
        if( iss >> y ) {
            break;
        } else {
            cerr << "Invalid input.  Try again.\n";
        }
    } else {
        cerr << "End of stream\n";
        break;
    }
}
于 2013-07-08T21:53:39.413 に答える