Я обычный тайник, но это мой первый пост! Я понимаю, что вы, ребята, любите детали, поэтому я сделаю все возможное. Я буду признателен за любой вклад, который кто-либо имеет.
Я работаю над перегрузкой оператора извлечения для объекта с динамическим массивом цифр. На входе консоли будет начальный пробел, затем 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»
Я считаю, что это означает, что << Б не удалось. Я инициализировал B на 0 в настоящее время, и остальная часть моего кода не представляет никаких других проблем. Это приватные данные, включающие только указатель и длину (количество цифр). Также C2I () — это функция, которая преобразует значения от 0 до 9 в 0-9.
Большая проблема для меня — я довольно новичок в разборе, поэтому у меня нет очень красноречивых способов проверить это или другие идеи.
Я снова ценю все, что вы, ребята, делаете. Я уже многому научился, просматривая здесь!
Задача ещё не решена.
Других решений пока нет …