get() и peek() помогают хранить большие числа

У меня проблемы с функциями cin.peek() и cin.get(). Ввод вообще всегда ускользает от меня. По сути, я пытаюсь получить строку цифр (которая может быть длиннее, чем int, поэтому она использует символы) для вставки в объект MyInt, используя перегрузку для >>. Класс MyInt, который я написал, содержит динамический массив символов с именем myNumber. Функция изменения размера делает именно это, изменяет размер динамического массива до нового размера.

мне нужно сделать две вещи

  1. Игнорировать ведущие пробелы
  2. Остановитесь на следующем символе, отличном от 0-9. (пробелы, буквы)

Вот что у меня есть:

istream& operator>> (istream& s, MyInt& n)
// Overload for the input operator                                                                                             
{
  char c;             // For peeking                                                                                           
  int x;
  MyInt input;        // For storing                                                                                           
  unsigned int counter = 0; // counts # of stored digits                                                                       

  while (isspace(s.peek()))
  {
    c = s.get();
  }

  while (C2I(s.peek()) != -1)
  {
    x = C2I(s.get());
    input.myNumber[counter] = I2C(x);
    counter++;
    input.Resize(counter);
  }
  cout << "WHAH WHAH WEE WAH\n";

  n = input;
}

Main вызывает только это:

cout << "Enter first number: ";
cin >> x;
cout << "Enter second number: ";
cin >> y;

cout << "You entered:\n";
cout << "  x = " << x << '\n';
cout << "  y = " << y << '\n';

Вот результат, который я получил:

Enter first number: 14445678954333
WHAH WHAH WEE WAH
Enter second number: 1123567888999H
WHAH WHAH WEE WAH
You entered:
  x = 111111111111113
  y = 11111111111119

Я студент, и это «домашнее задание». Так что, как и со всеми домашними заданиями, мне дают нелогичные вещи, к которым я не могу получить доступ. Это класс строк. Это довольно незначительная часть работы, но она как заноза в моем боку.


person jordaninternets    schedule 16.11.2011    source источник


Ответы (2)


Я бы сказал, запустите его в отладчике и узнайте, где вы испортили массив, я бы предположил изменение размера.

поскольку ваш ввод и вывод следуют шаблону.

14445678954333
111111111111113

1123567888999H
11111111111119

Вы слишком длинны, и первая и последняя цифры совпадают.

person r_ahlskog    schedule 16.11.2011

Почему бы не всегда использовать std::string для чтения и записи ваших чисел?

Тогда все, что вам нужно, это преобразование из MyInt ‹-> std::string.

class MyInt
{
    vector<int> Integers;
public:
    MyInt( const string& source )
    {
        for ( size_t i = 0; i < source.size(); ++i )
        {
            Integers.push_back( source[i] - '0' );
        }
    }

    MyInt()
    {
    }

};

istream& operator>> (istream& s, MyInt& n)
{
    string input;
    s >> input;
    n = input;
    return s;
}

int main()
{

    MyInt input;
    cout << "Enter first number: ";
    cin >> input;

    return 0;
}
person parapura rajkumar    schedule 16.11.2011
comment
Не упомянул об этом, но я пометил это «домашнее задание». Так что, как и со всеми домашними заданиями, мне дают нелогичные вещи, к которым я не могу получить доступ. Это класс строк. Я отредактирую основное. - person jordaninternets; 16.11.2011