读取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)));
}
答
如果你想读数字,你需要一次做一个角色。例如。
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
。
当你想要一个动态改变其长度的数组时,使用std :: vector。 – cpx 2010-02-21 21:19:13
你不读任何负数 – 2010-02-21 21:30:11