À la première ligne de code suivante, j'obtiens cette erreur : impossible de convertir 'std :: string' en 'char *' pour l'argument '1' en 'char * strtok (char *, const char *) »Tokenizing String C++ compilateur/erreur logique
void ToToken() {
TokenLine.reserve(30);
char * tmp;
TokenLine[0]= strtok (Line," ");
while(tmp!=NULL)
for(int i=0;i<TokenLine.size();i++){
TokenLine[i]= strtok(NULL," ");
if(TokenLine[i]==NULL||TokenLine[i]==" ")
TokenLine.erase(i);
cout<<Token[i];
}
}
complet Code:
class CombatLine{
string Line;
bool combat;
char LT[4];
time_t rawtime;
vector<string> TokenLine;
CombatLine(){
combat = false;
}
void SetLine(string S){
Line="[Combat] 03:33:05 -Anthrax- Roshi heals -Anthrax- Roshi for 2630 points of damage.";
}
bool isLineCombat(){
if(Line.substr(0,8)=="[Combat]")
return true;
else
return false;
}
bool StrFound(string SubString){
size_t tmp;
tmp = Line.find(SubString);
if(tmp!=string::npos)
return true;
else
return false;
}
void SetLT(){
LT[0]=Line.at(13);
LT[1]=Line.at(14);
LT[2]=Line.at(16);
LT[3]=Line.at(17);
}
char ReturnLT(int Index){
return LT[Index];
}
void SetType(){
if (this->StrFound("(dodge)"))
Event.SetType("dodge");
if (this->StrFound(" (parry) "))
Event.SetType("parry");
if(this->StrFound("misses"))//because we know its not a parry or dodge if we made it this far
Event.SetType("miss");
if(this->StrFound(" strikes through "))
Event.SetType("st");
if(this->StrFound("(evaded)"))
Event.SetType("evade");
if(this->StrFound("crits"))
Event.SetType("crit");
if(this->StrFound("hits"))
Event.SetType("hit");
if(this->StrFound("glances"))
Event.SetType("glance");
else
Event.SetType("not found");
}
void ToToken(){
TokenLine.reserve(30);
char * tmp;
TokenLine[0]= strtok (Line," ");
while(tmp!=NULL)
for(int i=0;i<TokenLine.size();i++){
TokenLine[i]= strtok(NULL," ");
if(TokenLine[i]==NULL||TokenLine[i]==" ")
TokenLine.erase(i);
cout<<Token[i];
}
}
string ReturnType(){
this->SetType();
return Event.ReturnType();
}
void SetMinMax(){
if(Event.ReturnType()=="miss"||Event.ReturnType()=="dodge"||Event.ReturnType()=="parry")
Event.SetMinMax(0,0);
}};
Suis-je passer la mauvaise chaîne de type I à strtok. Je sais que je joue avec C-string et & chaîne C++ sans les distinguer beaucoup.
Est également strtok une méthode statique de String.h? Que faire si je veux passer une autre chaîne à tokenize?
Merci, Macaire de Bell
"Vous devrez faire une copie de la chaîne." -> de préférence avec un 'std :: vector' je suppose. –
fredoverflow
@Drakosha Si je vous comprends bien: Si j'utilise c_str() cela changerait ma chaîne en cstring? Mais puisque je le copie seulement dans une chaîne de vecteur comme des jetons je devrais créer une copie locale? – Malaken
@Malaken: 'std :: basic_string :: c_str()' retourne un pointeur sur une copie ** constante ** des données contenues dans la chaîne. Pour la plupart des implémentations STL, ce sont les mêmes données qui sont réellement conservées dans le tampon à l'intérieur de la chaîne, mais cela n'est en aucun cas nécessaire. Fondamentalement, vous ne pouvez pas utiliser le pointeur retourné par 'c_str' pour changer le contenu du tampon sur lequel pointe le pointeur (sinon vous avez un comportement indéfini) –