1

次のプログラムは、混合分数形式'whole_numbernumerator / denominator'でのユーザー入力を想定しており、それぞれの変数に値を割り当てます。

#include<iostream>
using namespace std;

int main()
{
    int whole, numerator, denominator;

    cout << "Input format: i<space>n/d" << endl;

    cin >> whole;
    cin.ignore(1000, ' ');
    cin >> numerator;
    cin.ignore(1000, '/');
    cin >> denominator;

    cout << whole << endl;
    cout << numerator << endl;
    cout << denominator << endl;

    return 0;
}

入力1:
123 345/678出力
1:
123
345
678入力2 : 1111111111 1111111111/1111111111出力 2 1111111111 1111111111 1111111111入力3: 2222222222 2222222222/222222222出力3: 214748364700プログラムが機能しない理由がわかり ませ ん入力3。















4

1 に答える 1

3

32ビット整数の最大値(2 ^ 31-1〜= 2.147b)がオーバーフローしています。これが発生cinすると、フラグをクリアするまで正しく機能しません。エラーをチェックする必要がありますが、短期的な解決策は、番号を符号なしにするか、のように64ビットのものを使用することint64_tです。cinまた、デフォルトでスキップされるため、スペースを無視する必要はありません。

有効な入力を確保するために、ここにあるようなものを実装できますが、特定の入力形式に合うように調整する必要があります。ageおそらく、フォーマットに関してそれぞれを入力するオーバーロードされた演算子を使用して3つを単一の型にカプセル化すると、構文がより適切に適合するため、例ではMixedNumberオブジェクトに置き換えることができます。

私はこのようなものを用途の広い方法として見るでしょう:

template <typename T> //any type will work
void getValidInput (T &var, std::string prompt = "Input: ") {
    while ((std::cout << prompt) && !(std::cin >> var)) { //if cin fails...
        std::cin.clear();                 //clear flag and discard bad input
        std::cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << "Invalid input; please re-enter.\n"; //let the user know
    } 
}

次に、次のようにプログラムを作成できます。

struct MixedNumber { //a data structure, so it's like using plain variables
    int64_t whole; 
    int64_t numerator;
    int64_t denominator;
};

std::istream &operator>> (std::istream &in, MixedNumber &num) { //so cin works
    in >> num.whole >> num.numerator;
    in.ignore(); //yes, you could enforce the format a bit more
    in >> num.denominator;
    return in;
}

int main() {
    MixedNumber num; //easy to "make" a mixed number, a constructor works well too
    getValidInput (num, "Input format: i<space>n/d: "); 
    std::cout << num.whole << '\n' << num.numerator << '\n' << num.denominator;
}
于 2012-06-15T02:21:51.040 に答える