问题描述
|
我一直在使用
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);
解决方法
格式化不是那么容易,但请查看
stringstream
。有关输入和输出缓冲区的格式化,另请参见ѭ4和ѭ5。
,在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,maxAngle,relative,name,parentName);
}
,您可以尝试使用stringstream。它比sscanf功能强大得多,并且可以达到目的。
,我相信stringstreams是您想要的。
例如:
stringstream tokenizer;
string str(\"42\");
int number;
tokenizer << string;
tokenizer >> number;
,如果您使用的是具有足够C ++ 0x支持的编译器,则很容易编写类型安全的scanf()-style
函数...在http://en.wikipedia.org/上阅读了printf()
示例。 wiki / C%2B%2B0x让您开始...。