如何读取可变数量的字符?用户可以输入太大而不能存储在整数中的正数或负数。然后我检查以确保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)) );
}
答案 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)。对于不同的字符编码,这些值可能不同,但标准保证数字是连续的,因此减去零可以工作。