【问题标题】:How to enable the input stream the first time with Cin?如何第一次使用 Cin 启用输入流?
【发布时间】:2015-01-11 06:02:02
【问题描述】:

我需要将一个很长的 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 只是我包含的头文件(不是 STL)中的 stack,我将 stack 设为 LongInt 所属的类的私有变量。)当我输入数字 5796作为long int,当我的程序运行时,输出是 55 或 57 或一些随机的 2 位数字,这显然是错误的。请告诉我!! 非常感谢!!

【问题讨论】:

  • 使用cin.get(),只会得到一个字符,它被视为char。为什么不将输入作为字符串获取,然后根据自己的喜好解析字符串?
  • 好吧,我从来没想过。所以你是说使用 get line 并将其存储在一个字符串中?还是类似的正确?
  • 是的,尽管取决于数字的大小,您可以使用 long long 类型,它是 64 位与 32 位相比,int,还有其他类型用于更大的整数,采取看看这个 StackOverflow 问题。 Types bigger than long long in C++ 我相信 C++11 支持 long long 类型作为 cin 提取运算符的参数。
  • 这对我不起作用。有谁知道如何解决这一问题?字符串线;获取线(cin,线); cout
  • Dude lrn2 接受答案。 seriously.

标签: c++ overloading operator-keyword cin


【解决方案1】:

当您需要解析输入时,您可能会单独处理字符。为此,我个人会使用std::istreambuf_iterator&lt;char&gt;,尽管您也可以使用std::istream::get()。后者将返回一个int 代表一个 char 它将返回一个指示已到达流的末尾,即值std::char_traits&lt;char&gt;::eof()。使用std::istreambuf_iterator&lt;char&gt;,您只需像处理任何其他序列一样获得相同的检查,因此是我的偏好。在这两种情况下,您可能应该开始跳过空格,因为这很可能是一个分隔符。由于无论如何都会解析输入,因此最简单的方法是使用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;
}

【讨论】:

  • 我可以使用一些不太复杂的东西吗?不太确定我是否可以使用复杂的信息。感谢您的回答和努力
  • @JustinBalingit:您认为您不需要代码的哪一部分?我认为您需要所有这些(实际上,当根本没有数字应该将流置于失败状态时,我实际上忘记了处理该案例;现在添加了)。
猜你喜欢
  • 2015-07-08
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 2013-09-14
  • 2016-05-23
  • 1970-01-01
相关资源
最近更新 更多