Чтение пользовательского ввода переменной длины в C ++ - PullRequest
2 голосов
/ 22 февраля 2010

Как мне прочитать переменное количество символов? Пользователь может ввести положительное или отрицательное число, которое является слишком большим, чтобы быть сохраненным в целом числе. Затем я проверяю, чтобы убедиться, что символ является числом, и храню его в массиве целых чисел (хотя это, вероятно, изменится на короткое, поскольку мне нужно только иметь возможность хранить 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)) );
}

Ответы [ 3 ]

2 голосов
/ 22 февраля 2010

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

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

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

2 голосов
/ 22 февраля 2010

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

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). Значения могут быть разными для разных кодировок символов, но по стандарту цифры гарантируются последовательными, так что вычитание нуля работает.

2 голосов
/ 22 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...