有这样一个字符串:M90I4D7
我需要将它插入这种结构:
struct CigarOp {
char Type; //!< CIGAR operation type (MIDNSHPX=)
uint32_t Length; //!< CIGAR operation length (number of bases)
//! constructor
CigarOp(const char type = '\0',
const uint32_t& length = 0)
: Type(type)
, Length(length)
{ }
};
这意味着我需要将它分成 3 组,每组都是一个 CigarOp( 'M' ,90 'I', 4 'D' ,7 )
最佳答案
假设字符串的形式为 ([A-Z][0-9]+)*,您可以非常简单地执行如下操作:
#include <sstream>
...
std::vector<CigarOp> cigars;
std::istringstream parser("M90I4D7");
char c;
std::uint32_t l;
while(parser >> c >> l) {
cigars.push_back(CigarOp(c, l));
}
请注意,此代码不执行任何类型的验证。如果需要验证,实现它的一种方法是使用 Boost.Spirit(在 http://boost.org 上找到):
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/adapted/struct.hpp>
#include <cstdint>
#include <iostream>
struct CigarOp {
char Type;
std::uint32_t Length;
};
BOOST_FUSION_ADAPT_STRUCT(CigarOp, (char, Type) (std::uint32_t, Length))
int main() {
using boost::spirit::qi::phrase_parse;
using boost::spirit::qi::char_;
using boost::spirit::qi::uint_;
using boost::spirit::qi::standard::space;
std::vector<CigarOp> cigars;
std::string s = "M90I4D7";
std::string::const_iterator first = s.begin(), last = s.end();
bool r = phrase_parse(first, last, *(char_ >> uint_), space, cigars);
if(r && first == last) {
// string was well-formed
for(auto const &cigar : cigars) {
std::cout << cigar.Type << ", " << cigar.Length << '\n';
}
}
}
关于c++ - 如何拆分字符串并在 C++ 中得到我想要的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27055520/