用C ++读取变长用户输入

时间:2010-02-21 21:06:44

标签: c++ input

如何读取可变数量的字符?用户可以输入太大而不能存储在整数中的正数或负数。然后我检查以确保char是一个数字并将其存储在一个int数组中(尽管这可能会更改为short,因为我只需要能够存储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 个答案:

答案 0 :(得分:2)

为什么不输入字符串,然后将其转换为数字?

答案 1 :(得分:2)

几点。首先,如果你只需要存储从0到9的值,你也可以将它们存储在一个char中(这只是C ++中的一个小整数类型)。

其次,您可能需要在break;语句中的所有case的末尾添加switch - 在C ++中,执行从一个案例到下一个案例没有break来阻止它。然后,您应该完全摆脱switch语句。您最好使用isdigit中的<ctype.h>。由于char是C ++中的一个小整数类型,因此您也可以对其进行数学运算,因此您可以在验证它是一个数字之后从每个数字中减去'0'。编辑:与后面的编辑相反,我强烈建议不要从每个数字中减去48。首先,它不能保证工作(并且不会使用某些字符集 - 即使您认为您的代码不会在IBM大型机上使用,这也是一种不好的习惯)。其次,它使意图更加明显。我认为没有充分的理由期望读者记住ASCII表,因此他们会知道48相当于'0'

最后,为了解决您认识的问题,您可能希望查找std::vector

答案 2 :(得分:2)

如果你想读数字,你需要一次做一个字符。 E.g。

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)。对于不同的字符编码,这些值可能不同,但标准保证数字是连续的,因此减去零可以工作。