提取运算符导致我的程序退出?

时间:2014-03-24 09:40:06

标签: c++ operator-overloading seekg extraction-operator

我是一个常见的潜伏者,但这是我的第一篇文章!我知道你们都喜欢细节,所以我会尽我所能。我会很感激任何人的投入。

我正在为具有动态数字数组的对象重载提取运算符。控制台输入将具有前导空格,然后是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;
}

现在,我知道这种方法可能会起作用,但对我而言,这似乎是一种极端低效的方法。对于万亿数字,Grow()将重新分配数组万亿次!也许这并不像我想的那么糟糕?

我当前的方法一直在使用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现在是:-1'

我相信这意味着&lt;&lt; B失败了。我目前将B初始化为0,其余代码没有提出任何其他问题。它的私有成员数据只包括指针和长度(数字的数字)。此外,C2I()是一个将'0'转换为'9'到0到9的函数。

对我来说一个大问题是我对解析相当新,所以我没有非常雄辩的方法来测试这个或其他想法。

我再次感谢你们所做的一切。我已经从这里浏览了很多东西!

0 个答案:

没有答案