Чтение пользовательского ввода переменной длины в С++

Как прочитать переменное количество символов? Пользователь может ввести положительное или отрицательное число, которое слишком велико для хранения в виде целого числа. Затем я проверяю, является ли char числом, и сохраняю его в массиве целых чисел (хотя это, вероятно, будет изменено на короткое, так как мне нужно хранить только 0-9).

istream& operator>>(istream &in, LargeInt &l)
{
  char x;
  do
  {
      cin >> x;
      int v = (int)x;

      switch( v )
      {
          case 48: v = 0;
          case 49: v = 1;
          case 50: v = 2;
          case 51: v = 3;
          case 52: v = 4;
          case 53: v = 5;
          case 54: v = 6;
          case 55: v = 7;
          case 56: v = 8;
          case 57: v = 9;
          default: v=10 /* END INPUT */;
      }

      l.largeInt[ l.usedLength ] = v;
      l.usedLength++;
      //need to check array length and make bigger if needed
  }
  while( (x == 45) || ((x > 47) && (x < 57)) );
}

person Josh Curren    schedule 21.02.2010    source источник
comment
используйте std::vector, когда вам нужен массив, который динамически меняет свою длину.   -  person cpx    schedule 22.02.2010
comment
вы не читаете ни одного отрицательного числа   -  person    schedule 22.02.2010


Ответы (3)


Если вы хотите читать цифры, вам нужно делать это посимвольно. Например.

char ch;
while (std::cin.get(ch) && ch >= '0' && ch <= '9') {
    // You have a digit to process (maybe you want to push_back it into a vector)
}

Обратите внимание, что вам нужно использовать ch - '0', чтобы получить значение цифры, потому что ch содержит код символа, а не значение. В ASCII это означает, что '0' на самом деле равно 48, '1' равно 49 и так далее (а 'A' равно 65). Значения могут быть разными для разных кодировок символов, но стандарт гарантирует, что цифры будут последовательными, так что вычитание нуля работает.

person Tronic    schedule 21.02.2010

Почему бы не ввести строку, а затем преобразовать ее в число?

person Vlad    schedule 21.02.2010

Несколько моментов. Прежде всего, если вам нужно хранить только значения от 0 до 9, вы можете также хранить их в char (это всего лишь небольшой целочисленный тип в C++).

Во-вторых, вам, вероятно, потребуется добавить break; в конец всех case в вашем операторе switch — в C++ выполнение переходит от одного случая к другому без break для его остановки. Опять же, вам, вероятно, следует полностью избавиться от оператора switch. Вероятно, вам лучше использовать isdigit из <ctype.h>. Поскольку char — это небольшой целочисленный тип в C++, вы также можете выполнять над ним математические операции, поэтому вы можете просто вычесть '0' из каждой цифры после проверки того, что это цифра. Редактировать: в отличие от более позднего редактирования, я бы настоятельно не рекомендовал вычитать 48 из каждой цифры. Во-первых, нет гарантии, что он будет работать (и не будет работать с некоторыми наборами символов — даже если вы не думаете, что ваш код когда-либо будет использоваться на мейнфрейме IBM, это плохая привычка). Во-вторых, это делает намерение более очевидным. Я не думаю, что есть веская причина ожидать, что читатель запомнит таблицу ASCII и будет знать, что 48 эквивалентно '0'.

Наконец, чтобы решить проблему, о которой вы уже знали, вы, вероятно, захотите найти std::vector.

person Jerry Coffin    schedule 21.02.2010