【问题标题】:Getting long long with suffix out of istringstream (C++)使用 istringstream 的后缀变长(C++)
【发布时间】:2013-12-10 13:25:44
【问题描述】:

为什么 istringstream 似乎无法完全读取带后缀的数字文字?

#include <iostream>
#include <sstream>
using namespace std;

int main() {
    long long x = 123ULL; // shows 123ULL is a valid long long literal

    istringstream iss("123ULL");

    iss >> x;
    cout << "x is " << x << endl;

    char extra;
    iss >> extra;
    cout << "remaining characters: ";
    while(!iss.eof())
    {
        cout << extra;
        iss >> extra;
    }
    cout << endl;

    return 0;
}

这段代码的输出是

x is 123
remaining characters: ULL

此行为是否由语言环境控制?谁能指点我清除有关istringstream::operator&gt;&gt;(long long) 接受哪些字符串的文档?

【问题讨论】:

    标签: c++ literals istringstream long-long


    【解决方案1】:

    是的,它由语言环境控制(通过num_get 方面),但我听说没有任何语言环境支持 C++ 语言文字,而且自定义它的地方是错误的。

    流用于通用 I/O,C++ 整数文字后缀非常专业。

    默认num_get facet 的确切行为在 C++11 标准的第 22.4.2.1 节中进行了描述。该描述部分引用了 C 标准库中的 strto* 系列函数。你可以在这里找到一个稍微精简的版本:

    http://en.cppreference.com/w/cpp/locale/num_get/get

    【讨论】:

    • 谢谢。您能否建议在 C++ 中解释 C++ 数字文字的标准方法?
    • 您将编写一个包装器类型(struct CppInt 左右)并为其重载operator &gt;&gt;。您可能希望将有关后缀的信息添加到结构中,例如如果您的程序关心它,它可能有bool unsignedenum Type type(用于后缀LLL)。但是,如果您正在解析具有后缀整数文字的内容,则流可能根本是错误的解析方式;你应该看看像 Boost.Spirit 这样的解析器生成器。
    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 2019-04-28
    • 2011-02-15
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多