代码之家  ›  专栏  ›  技术社区  ›  Josh Curren

在C++中读取可变长度的用户输入

  •  2
  • Josh Curren  · 技术社区  · 15 年前

    如何读取可变字符数?用户可以输入一个大于或等于整数的正数或负数。然后,我检查以确保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)) );
    }
    
    3 回复  |  直到 15 年前
        1
  •  2
  •   Tronic    15 年前

    如果你想读数字,你需要一次读一个字符。例如。

    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
  •  2
  •   Vlad    15 年前

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

        3
  •  2
  •   Jerry Coffin    15 年前

    几点。首先,如果你只需要存储0到9的值,你最好把它们存储在一个字符中(这只是C++中的一个小整数类型)。

    其次,您可能需要添加 break; 到最后 case 你的S switch 语句——在C++中,执行从一个案例到另一个案例没有一个 break 停止它。再说一遍,你应该把 转换 全部陈述。你最好用 isdigit <ctype.h> . 自从 char 是C++中的一个小整数类型,你也可以在上面做数学运算,这样你就可以减去。 '0' 在确认它是一个数字之后,从每个数字开始。编辑:与后面的编辑相反,我强烈建议不要减法 48 从每个数字开始。首先,它不能保证工作(并且不能与某些字符集一起工作——即使您认为您的代码不会在IBM大型机上使用,这也是一个糟糕的习惯)。其次,它使意图更加明显。我认为没有充分的理由期望读者记住ASCII表,这样他们就会知道48等于 “0” .

    最后,为了解决你知道的问题,你可能会想查一下 std::vector .

    推荐文章