我是一个常见的潜伏者,但这是我的第一篇文章!我知道你们都喜欢细节,所以我会尽我所能。我会很感激任何人的投入。
我正在为具有动态数字数组的对象重载提取运算符。控制台输入将具有前导空格,然后是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的函数。
对我来说一个大问题是我对解析相当新,所以我没有非常雄辩的方法来测试这个或其他想法。
我再次感谢你们所做的一切。我已经从这里浏览了很多东西!