с использованием регулярного выражения будет выглядеть следующим образом (в C ++ 11 вы можете перевести это в boost или tr1 для VS2008):
// Assuming MAX_A...MAX_D are all 10 in our regex
std::cmatch res;
if(std::regex_match(input.data(),input.data()+input.size(),
res,
std::regex("([^@]{0,10})([^@]{0,10})([^@]{0,10})([^@]{0,10})")))
{
Foo foo = {};
std::copy(res[1].first,res[1].second,foo.a);
std::copy(res[2].first,res[2].second,foo.b);
std::copy(res[3].first,res[3].second,foo.c);
std::copy(res[4].first,res[4].second,foo.d);
}
Вы, вероятно, должны создать шаблон, используя строку формата и действительные переменные MAX_*
, а не жестко кодировать значения в регулярном выражении, как я сделал здесь, и вы также можете захотеть скомпилировать регулярное выражение один раз и сохранить его вместо воссоздания это каждый раз.
Но в противном случае этот метод позволяет избежать создания дополнительных копий строковых данных. char *
s, хранящиеся в каждом подспаривании в res
, являются указателем непосредственно в буфер входной строки, поэтому единственная копия находится непосредственно из входной строки в конечный объект foo.