Я пытаюсь разделить свой фактический ключ на точку, а затем извлечь все поля после разделения на точку.
Мой ключ будет выглядеть примерно так:
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..
strtok_r
— это Posix-эквивалент Windowsstrtok_s
. Чтобы использовать обычныйstrtok
, просто избавьтесь отp
и третьего аргумента для каждого вызова, но имейте в виду, что он не является потокобезопасным. - person Mike Seymour   schedule 26.11.2013#ifdef WINDOWS strtok_s #else strtok_r
- person jiveturkey   schedule 27.11.2013was not declared in this scope
означает именно то, что написано :) - person emesx   schedule 28.11.2013#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