strtok vs istringsteam при разделении строк?

Я пытаюсь разделить свой фактический ключ на точку, а затем извлечь все поля после разделения на точку.

Мой ключ будет выглядеть примерно так:

t26.example.1136580077.colox

Ниже приведен код, который у меня был, он должен работать нормально, но после этого я понял, что он предназначен только для Windows, и я запускаю свой код на Ubuntu, и по этой причине я всегда получаю -

 error: âstrtok_sâ was not declared in this scope

Ниже мой код

if(key) {
    vector<string> res;
    char* p;
    char* totken = strtok_s(key, ".", &p);
    while(totken != NULL)
    {
        res.push_back(totken);
        totken = strtok_s(NULL, ".", &p);
    }

    string field1 = res[0]; // this should be t26
    string field2 = res[1]; // this should be example
    uint64_t field3 = atoi(res[2].c_str()); // this should be 1136580077
    string field4 = res[3]; // this should be colox

    cout<<field1<<" "<<field2<<" "<<field3<<" "<<field4<<endl;
}         

Я использую Ubuntu 12.04, а версия g++ -

g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3

Есть ли способ сделать то же самое, используя простой strtok, так как я не хочу использовать istringstream, так как strtok будет более эффективным по сравнению с istringstream..


person AKIWEB    schedule 26.11.2013    source источник
comment
strtok_r — это Posix-эквивалент Windows strtok_s. Чтобы использовать обычный strtok, просто избавьтесь от p и третьего аргумента для каждого вызова, но имейте в виду, что он не является потокобезопасным.   -  person Mike Seymour    schedule 26.11.2013
comment
...или наслаждайтесь идиомой C и #ifdef WINDOWS strtok_s #else strtok_r   -  person jiveturkey    schedule 27.11.2013
comment
@jnbbender: Не могли бы вы привести пример того, как это сделать? Спасибо за помощь..   -  person AKIWEB    schedule 27.11.2013
comment
@TrekkieTechieT-T, что именно тебе непонятно? was not declared in this scope означает именно то, что написано :)   -  person emesx    schedule 28.11.2013
comment
Я запускаю его на машине с Ubuntu, а strtok_s предназначен только для Windows, поэтому не знаю, как решить эту проблему.   -  person AKIWEB    schedule 28.11.2013
comment
Извините, что вернулся так поздно. #ifdef WINDOWS #define TOKEN(x, y, z) strtok_s( (x), (y), (z) ) #else #define TOKEN(x, y, z) strtok_r( (x), (y), (z) ) #endif. Вам придется поиграть с макросами, они, вероятно, слишком просты, но должны работать для примера, который вы привели. Замените strtok_s на TOKEN, и все будет в порядке в обеих системах.   -  person jiveturkey    schedule 03.12.2013