C ++相当于sscanf?

时间:2011-05-24 01:21:20

标签: c++ stl

我一直在使用sscanf,我觉得我已经太熟悉了。显然它也被弃用了,我应该使用sscanf_s,据我所知,这不是标准的。所以我想知道STL是否有一个惯用的C ++替代品做同样的事情?

由于

我做:

        sscanf(it->second->c_str(),"%d %f %f %f %f %f %f %d \" %[^\"] \" \" %[^\"]",
            &level, &x, &y, &angle, &length, &minAngle, &maxAngle, &relative, name,parentName);

5 个答案:

答案 0 :(得分:11)

格式化并不容易,但请查看stringstream。另请参阅istringstreamostringstream以了解输入和输出缓冲区格式。

答案 1 :(得分:10)

在C ++中,终极解析器是Boost.Qi

#include <boost/spirit/include/qi.hpp>
#include <string>

namespace qi = boost::spirit::qi;

int main()
{
    int level, relative;
    float x, y, angle, length, minAngle, maxAngle;
    std::string name, parentName;

    std::string input = "20 1.3 3.7 1.234 100.0 0.0 3.14 2 \"Foo\" \"Bar\"";
    std::string::iterator begin = input.begin();
    std::string::iterator end = input.end();

    using qi::int_;
    using qi::float_;
    using qi::char_;
    using qi::lit;
    using qi::ascii::space;

    qi::phrase_parse(begin, end,
        int_ >> float_ >> float_ >> float_ >> float_ >> float_ >> float_ >> int_
             >> lit("\"") >> *(~char_('"')) >> lit("\"")
             >> lit("\"") >> *(~char_('"')) >> lit("\""),
        space,
        level, x, y, angle, length, minAngle, maxAngle, relative, name, parentName);
}

答案 2 :(得分:1)

您可以尝试使用stringstream。它比sscanf强大得多,并且达到了目的。

答案 3 :(得分:1)

我相信字符串流是您正在寻找的。

例如:

stringstream tokenizer;
string str("42");
int number;

tokenizer << string;
tokenizer >> number;

答案 4 :(得分:1)

如果您正在使用具有足够C ++ 0x支持的编译器,则可以轻松编写类型安全的scanf()-style函数...读取{{1来自http://en.wikipedia.org/wiki/C%2B%2B0x的示例让您入门....