C ++ эквивалент Sscanf? - PullRequest
7 голосов
/ 24 мая 2011

Я использовал 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 ]

11 голосов
/ 24 мая 2011

Форматирование не так просто, но посмотрите stringstream. См. Также istringstream и ostringstream для форматирования входных и выходных буферов.

10 голосов
/ 24 мая 2011

В 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);
}
1 голос
/ 24 мая 2011

Если вы используете компилятор с достаточной поддержкой C ++ 0x, легко написать безопасную для типов функцию scanf()-style ... прочитать пример printf() в http://en.wikipedia.org/wiki/C%2B%2B0x чтобы вы начали ....

1 голос
/ 24 мая 2011

Я считаю, что струнные потоки - это то, что вы ищете.

например:

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

tokenizer << string;
tokenizer >> number;
1 голос
/ 24 мая 2011

Вы можете попробовать использовать stringstream . Он намного мощнее sscanf и служит цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...