我需要在非常长的Int中读入我正在制作的Long Int类,我正在超载cin >>
运算符。用户必须立即输入整个号码。例如:444444444444444444444444444
我计划使用cin.get()
并将结果转换为int
,这样我就可以从流中获取第一个4
,但它无效。有人可以帮我提一下任何提示/建议吗?
istream& operator>>(istream &input, LongInt &longint)
{
int check; ////
int first;
first = (int)(cin.get());
longint.stack_li.push(first);
cout << first;
//while (isdigit((int)(input.peek())))
//{
// longint.stack_li.push((int)(check = input.get()));
// cout << check;
//}
return input;
}
(stack_li
只是我所包含的头文件中的stack
(不是STL&#39;)我将stack
作为类{{1}的私有变量当我的程序运行时,当我输入数字5796为LongInt
时,输出为55或57或一些随机的2位数字,这显然是错误的。请告诉我!!
非常感谢!!
答案 0 :(得分:4)
当您需要解析输入时,您可能会单独处理字符。为此,我个人会使用std::istreambuf_iterator<char>
,尽管您也可以使用std::istream::get()
。后者将返回int
代表一个 char
或它将返回指示已到达流的末尾,即值std::char_traits<char>::eof()
。使用std::istreambuf_iterator<char>
你只需处理一个与其他序列一样的序列来获得相同的检查,因此我的偏好。在这两种情况下,您可能应该开始跳过空格,因为这可能是一个分隔符。由于无论如何都要解析输入,最简单的方法是使用std::istream::sentry
。把它们放在一起,你会有这样的事情:
std::istream& operator>> (std::istream& in, LongInt& longInt) {
std::istream::sentry kerberos(in);
if (kerberos) {
std::istreambuf_iterator<char> it(in), end;
if (it == end || !std::isdigit(static_cast<unsigned char>(*it))) {
std::setstate(std::ios_base::failbit);
}
while (it != end && std::isdigit(static_cast<unsigned char>(*it))) {
// do something with the next digit
}
}
return in;
}