Сбой, потому что str.c_str()
возвращает константную строку, но char * strtok (char * str, const char * delimiters )
требует изменяемой строки. Поэтому вам нужно использовать * const_cast > для того, чтобы сделать его волетильным.
Я даю вам полную, но небольшую программу для токенизации строки с помощью функции C strtok ().
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int main() {
string s="20#6 5, 3";
// strtok requires volatile string as it modifies the supplied string in order to tokenize it
char *str=const_cast< char *>(s.c_str());
char *tok;
tok=strtok(str, "#, " );
int arr[4], i=0;
while(tok!=NULL){
arr[i++]=stoi(tok);
tok=strtok(NULL, "#, " );
}
for(int i=0; i<4; i++) cout<<arr[i]<<endl;
return 0;
}
ПРИМЕЧАНИЕ: strtok может не подходить для всех ситуаций, так как строка, передаваемая в функцию, модифицируется путем разбивки на меньшие строки . Пожалуйста, ref , чтобы лучше понять функциональность strtok.
Как работает strtok
Добавлено несколько операторов печати, чтобы лучше понять изменения, возникающие в строке при каждом вызове strtok, и то, как он возвращает токен.
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int main() {
string s="20#6 5, 3";
char *str=const_cast< char *>(s.c_str());
char *tok;
cout<<"string: "<<s<<endl;
tok=strtok(str, "#, " );
cout<<"String: "<<s<<"\tToken: "<<tok<<endl;
while(tok!=NULL){
tok=strtok(NULL, "#, " );
cout<<"String: "<<s<<"\t\tToken: "<<tok<<endl;
}
return 0;
}
Выход:
string: 20#6 5, 3
String: 206 5, 3 Token: 20
String: 2065, 3 Token: 6
String: 2065 3 Token: 5
String: 2065 3 Token: 3
String: 2065 3 Token:
strtok выполняет итерацию по строке. Первый вызов находит символ без делимера (в данном случае 2) и помечает его как маркер start , затем продолжает поиск разделителя и заменяет его на нулевой символ (# заменяется в фактическая строка) и возвращает start , который указывает на начальный символ токена (т. е. он возвращает токен 20, который завершается нулем). При последующем вызове он начинает сканирование со следующего символа и возвращает токен, если найден еще ноль. последовательно возвращает токены 6, 5, 3.