2017-03-22 3 views
0

ich auf einem C++ Projekt arbeite, die ein Skript nimmt, hebt den Text mit HTML-Spannweiten und gibt sie in einem gtkmm Fenster. Ich habe es funktioniert, aber ich möchte einen Algorithmus machen, der den Code registriert, anstatt einen Vektor von Schlüsselwörtern zu verwenden. (Ich weiß, es gibt Websites und Sachen, die es für mich tun, aber ich möchte nur diese Software machen).finden Code in einem String

ich jetzt bin auf Hervorhebung UnityC#, und ich habe ein Problem, das ich selbst und meine Codierung Lehrer können nicht zu beheben sein scheinen. (Mein Lehrer brauchte nicht Stunden, um zu überprüfen, was falsch war, aber wir haben es eine Weile lang angeschaut).

Ich sehe für alle Perioden und sie in einem Vektor setzen, dann ich Schleife durch den Vektor und versuchen, die richtige Teilkette zu erhalten. Ich starte den Teilstring an der Position der Periode + 1, also schließe ich die Periode nicht ein. Dann möchte ich den Teilstring beenden, wenn der nächste Punkt kommt, also überprüfe ich, wann er einen anderen Punkt findet, der am Anfang des Wortes beginnt. Das erste Mal, es funktioniert und es druckt „verwandeln“, aber das zweite Mal, er druckt „Position.x; var a = 1“ und das dritte Mal, er druckt „x; var a = 10;“.

std::vector<std::size_t> positions; 
std::string pats = "GameObject.transform.position.x; var a=10;"; 
std::size_t pos = 0; 

while(pats.find(".", pos) != std::string::npos) 
{ 
    std::size_t found = pats.find(".", pos); 
    if(found != std::string::npos) 
    { 
     positions.push_back(found); 
    } 
    pos = found+1; 
} 

for(int i = 0; i &lt; positions.size(); i++) 
{ 
    std::cout&lt;&lt;pats.substr(positions[i]+1, pats.find_first_of(".", positions[i])-1)&lt;&lt;endl; 
} 

Ich verstehe, wird es auf der x-mess up, weil es ein Semikolon dahinter statt Zeit hat, aber ich verstehe nicht, warum es auch die Position vermasselt, bitte helfen :)

Grüße, Dani

Antwort

0

Nichts, ich bin dumm. Ich habe die Teilstring-Funktion falsch gelesen und dachte, dass ich die Endposition und nicht die Größe angeben muss.

std::vector<std::size_t> positions; 
    std::string pats = "GameObject.transform.position.x; var a=10;"; 
    std::size_t pos = 0; 

    while(pats.find(".", pos) != std::string::npos) 
    { 
     std::size_t found = pats.find(".", pos); 
     if(found != std::string::npos) 
     { 
      //std::cout<< pats.substr(found+1)<<endl; 
      positions.push_back(found); 
     } 
     pos = found+1; 
    } 

    for(int i = 0; i < positions.size(); i++) 
    { 
     std::size_t start_pos = positions[i]+1; 
     std::size_t end_pos = pats.find_first_of(".", positions[i]+1); 
     std::cout<<pats.substr(start_pos, end_pos-start_pos)<<endl; 
    } 
Verwandte Themen