get () и peek () помогают хранить большие числа - PullRequest
2 голосов
/ 16 ноября 2011

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

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

  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

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

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

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

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

14445678954333
111111111111113

1123567888999H
11111111111119

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

1 голос
/ 16 ноября 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;
}
...