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

问题描述:

如何读取可变数量的字符?用户可以输入一个太大的正数或负数,不能存储在一个整数中。然后我检查以确保char是一个数字并将其存储在一个int数组中(尽管可能会将其更改为short,因为我只需要能够存储0-9)。读取C++中的可变长度用户输入

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))); 
} 
+0

当你想要一个动态改变其长度的数组时,使用std :: vector。 – cpx 2010-02-21 21:19:13

+0

你不读任何负数 – 2010-02-21 21:30:11

如果你想读数字,你需要一次做一个角色。例如。

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)。对于不同的字符编码,这些值可能不同,但数字由标准保证为顺序的,以便减去零工作。

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

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

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