#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#define MAX_A 40
#define MAX_B 3
#define MAX_C 40
#define MAX_D 4
struct Foo {
char a[ MAX_A ];
char b[ MAX_B ];
char c[ MAX_C ];
char d[ MAX_D ];
};
template <std::ptrdiff_t N>
const char* extractToken(const char* inIt, char (&buf)[N])
{
if (!inIt || !*inIt)
return NULL;
const char* end = strchr(inIt, '@');
if (end)
{
strncpy(buf, inIt, std::min(N, end-inIt));
return end + 1;
}
strncpy(buf, inIt, N);
return NULL;
}
template <std::ptrdiff_t N>
std::string display(const char (&buf)[N])
{
std::string result;
for(size_t i=0; i<N && buf[i]; ++i)
result += buf[i];
return result;
}
int main(int argc, const char *argv[])
{
std::string input = "abcd@efgh@ijkl@mnop";
Foo foo = { 0 };
const char* cursor = input.c_str();
cursor = extractToken(cursor, foo.a);
cursor = extractToken(cursor, foo.b);
cursor = extractToken(cursor, foo.c);
cursor = extractToken(cursor, foo.d);
std::cout << "foo.a: '" << display(foo.a) << "'\n";
std::cout << "foo.b: '" << display(foo.b) << "'\n";
std::cout << "foo.c: '" << display(foo.c) << "'\n";
std::cout << "foo.d: '" << display(foo.d) << "'\n";
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCiNkZWZpbmUgTUFYX0EgNDAKI2RlZmluZSBNQVhfQiAzCiNkZWZpbmUgTUFYX0MgNDAKI2RlZmluZSBNQVhfRCA0CgpzdHJ1Y3QgRm9vIHsKICAgIGNoYXIgYVsgTUFYX0EgXTsKICAgIGNoYXIgYlsgTUFYX0IgXTsKICAgIGNoYXIgY1sgTUFYX0MgXTsKICAgIGNoYXIgZFsgTUFYX0QgXTsKfTsKCnRlbXBsYXRlIDxzdGQ6OnB0cmRpZmZfdCBOPgpjb25zdCBjaGFyKiBleHRyYWN0VG9rZW4oY29uc3QgY2hhciogaW5JdCwgY2hhciAoJmJ1ZilbTl0pCnsKICAgIGlmICghaW5JdCB8fCAhKmluSXQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgY29uc3QgY2hhciogZW5kID0gc3RyY2hyKGluSXQsICdAJyk7CiAgICBpZiAoZW5kKQogICAgewogICAgICAgIHN0cm5jcHkoYnVmLCBpbkl0LCBzdGQ6Om1pbihOLCBlbmQtaW5JdCkpOwogICAgICAgIHJldHVybiBlbmQgKyAxOwogICAgfQogICAgc3RybmNweShidWYsIGluSXQsIE4pOwogICAgcmV0dXJuIE5VTEw7Cn0KCnRlbXBsYXRlIDxzdGQ6OnB0cmRpZmZfdCBOPgpzdGQ6OnN0cmluZyBkaXNwbGF5KGNvbnN0IGNoYXIgKCZidWYpW05dKQp7CiAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CiAgICBmb3Ioc2l6ZV90IGk9MDsgaTxOICYmIGJ1ZltpXTsgKytpKQogICAgICAgcmVzdWx0ICs9IGJ1ZltpXTsKICAgIHJldHVybiByZXN1bHQ7IAp9CgppbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKQp7CiAgICBzdGQ6OnN0cmluZyBpbnB1dCA9ICJhYmNkQGVmZ2hAaWprbEBtbm9wIjsKCiAgICBGb28gZm9vID0geyAwIH07CgogICAgY29uc3QgY2hhciogY3Vyc29yID0gaW5wdXQuY19zdHIoKTsKICAgIGN1cnNvciA9IGV4dHJhY3RUb2tlbihjdXJzb3IsIGZvby5hKTsKICAgIGN1cnNvciA9IGV4dHJhY3RUb2tlbihjdXJzb3IsIGZvby5iKTsKICAgIGN1cnNvciA9IGV4dHJhY3RUb2tlbihjdXJzb3IsIGZvby5jKTsKICAgIGN1cnNvciA9IGV4dHJhY3RUb2tlbihjdXJzb3IsIGZvby5kKTsKCiAgICBzdGQ6OmNvdXQgPDwgImZvby5hOiAnIiA8PCBkaXNwbGF5KGZvby5hKSA8PCAiJ1xuIjsKICAgIHN0ZDo6Y291dCA8PCAiZm9vLmI6ICciIDw8IGRpc3BsYXkoZm9vLmIpIDw8ICInXG4iOwogICAgc3RkOjpjb3V0IDw8ICJmb28uYzogJyIgPDwgZGlzcGxheShmb28uYykgPDwgIidcbiI7CiAgICBzdGQ6OmNvdXQgPDwgImZvby5kOiAnIiA8PCBkaXNwbGF5KGZvby5kKSA8PCAiJ1xuIjsKfQo=