Tokenizing String C ++ / логическая ошибка - PullRequest
0 голосов
/ 21 ноября 2010

В следующей первой строке кода я получаю эту ошибку: не могу преобразовать 'std :: string' в 'char *' для аргумента '1' в 'char * strtok (char *, const char *)'

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];
        }

}

Полный код:

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);
    }};

Я передаю неверную строку типа I в strtok.Я знаю, что я играю с C-строкой и & C ++ string без особого различия между ними.

Также является ли strtok статическим методом String.h?Что, если я хочу передать ему еще одну строку для токенизации?

Спасибо, Macaire Bell

Ответы [ 3 ]

3 голосов
/ 21 ноября 2010

strtok нужна изменяемая строка C, а не std::string.Чтобы получить строку C из std::string, используйте метод c_str().Однако вы должны , а не передать его strtok, потому что он не должен быть изменен.Вам нужно будет сделать копию строки.

Чтобы создать копию, возможен следующий путь:

std::string strToTokenize;
char * tmpStr = new char[strToTokenize.size() + 1];
if (NULL == tmpStr) {...}
strcpy(tmpStr, strToTokenize.c_str());
// tokenize tmpStr
// ...
delete [] tmpStr;

или с std :: vector:

std::string strToTokenize;
std::vector<char> tmpStr = strToTokenize; // don't have a compiler now, probably won't work
// tokenize char * cStrToTokenize = &(*strToTokenize.begin());
// ...
0 голосов
/ 21 ноября 2010

И является ли strtok статическим методом String.h?Что если я хочу передать ему еще одну строку для токенизации?

strtok() - это зверь из стандартной библиотеки C , которую C ++ получил по наследству.От C ++ POV это небезопасно и его следует избегать.Способ токенизации строки, разделенной пробелами, в C ++ заключается в использовании потоков строк.Примерно:

std::istringstream iss(Line);
std::string token;
while(iss >> token) // fails on error and EOF
  process(token);
if(!iss.eof()) // failed on error
  throw "Dude, you need error management!";
0 голосов
/ 21 ноября 2010

Изменение

TokenLine[0]= strtok (Line," ");

до

TokenLine[0]= strtok (Line.c_str()," ");
...