3

常連ですが初投稿です!細かいところが好きなのはわかりますので、頑張ります。誰からの情報も歓迎します。

数字の動的配列を持つオブジェクトの抽出演算子のオーバーロードに取り組んでいます。コンソール入力の先頭には空白があり、次に int があり、その後に何かが続きます。空白を無視して int を抽出し、残りはそのままにしておく必要があります。簡単でしょ?

オンラインで見つけたコードの例を次に示します。

    istream & operator >> (istream &m, MyInt & p)
{
    int x = 0;
    p.currentLength = 0;
    while ((m.peek() == '\n') || (m.peek() == '\0') ||
           (m.peek() == '\t') || (m.peek() == ' '))
    {
        m.get();
    }
        while ((m.peek() >= '0') && (m.peek() <= '9'))
    {
        if (p.currentLength >= p.maxSize)
        {
            p.grow();
        }
        m >> p.theNumber[x];
        x++;
        p.currentLength++;
    }
    m.get();
    // reverse the order (i.e. - 123 to 321)
    char * temp = new char[p.maxSize];
        for (int y = 0; y < p.currentLength; y++)
    {
        temp[y] = p.theNumber[p.currentLength - 1 - y];
    }   
    delete [] p.theNumber;
    p.theNumber = temp;

    return m;
}

今、私はこの方法がうまくいくかもしれないことを理解していますが、私には非常に非効率的な方法のように思えます. 1 兆桁の数値の場合、Grow() は配列を 1 兆回再割り当てします! おそらく、これは私が思っているほど悪くはありませんか?

私の現在の方法は、seekg() と peek() と get() を使用しています。そのようです:

    istream& operator >> (istream& is, MyInt& z)
{
    int i = 0, j = 0;
    // check if next char is white
    while (is.peek() == 38)
    {
        j++;
        is.seekg(j); // skip if white
    }
    while (isdigit(is.peek()))
    {
        i++;
        is.seekg(j + i);
        if (!is.peek())
        {
            is.clear();
            break;
        }
    }
    is.seekg(j);
    z.length = i; 
    z.digits = new int[i + 1];
    for (i = 0; i < z.length; i++)
    {
        z.digits[i] = C2I(is.get());
    }
    return is;
}

また、ここに私のメインがあります:

  int main()
{
    MyInt B;
    cout << "\n\nChange B to what num? ---> ";
    cin >> B;
    cout << "B is now: " << B;

    char c;
    cout << "\n\n\n\n\nEnter char to exit :   ";
    cin >> c;
    return 0;
}

私の人生では、プログラムが終了する原因を見つけることができません。最後の出力は、「B is now: -1」と言っているようです

これは << B が失敗したことを意味すると思います。現在、B は 0 に初期化されており、残りのコードでは他の問題は発生していません。プライベート メンバー データには、ポインターと長さ (桁数) のみが含まれます。また、C2I() は「0」から「9」を 0 から 9 に変換する関数です。

私にとって大きな問題は、私が解析にかなり慣れていないことです。そのため、これをテストするための非常に雄弁な方法や他のアイデアを持っていません。

繰り返しになりますが、皆さんのすべてのことに感謝しています。ここを閲覧することで、すでに多くのことを学びました。

4

0 に答える 0