2016-08-02 2 views
-3

Um einen Zeitstempel von meinem String abzuziehen, verwende ich substring (pos, # char).So subtrahieren Sie einen spezifizierten Text von einem String mit der Funktion substring

Mein Code funktioniert teilweise. Das Problem, das ich habe, ist Konsistenz. Ich erhalte eine Zeichenfolge aus einer Textdatei im Format "Name Time", Beispiel: "Don 00:12".

Diese Zeichenfolge wird aus der Datei in HighScoreInfo1 extrahiert. Auch aus einer anderen Datei extrahiere ich einen String, der den Namensteil darstellt, in previous_name.

Mit dieser Information versuche ich die Position zu berechnen, an der der Teilstring beginnen soll.

int test = HighScoreInfo1.size() - (previous_name.size()+1); 

Ich habe bereits Maßnahmen für die zusätzliche Char, die ein Leerzeichen ist, das ist die +2. 1 für den Raum und 1, um an die Position zu gelangen, an der er starten soll.

Der Zeitstempel 00:00 ist fünf Zeichen lang.

   int test = HighScoreInfo1.size() - (previous_name.size()+2); 
       TimeToBeat = HighScoreInfo1.substr(test, 5); 
       TestFile << "Orginal string size " << ">>" << HighScoreInfo1.size() << " " << "size of name"<< ">>" <<previous_name.size()+2<<" " << "Position "<< test << endl; 
       TestFile << "Orginal string " << ">>"<<HighScoreInfo1 << " " << "Substring"<< ">>" <<TimeToBeat << endl; 

das ist mein Ausgang mit einem langen Namen:

Orginal string size >>14   size of name>>10 Position >> 4 
    Orginal string  >>Chrystel 00:09 Substring>>stel 

Nebenbei bemerkt: Sie kann es nicht sehen, aber mit dem obigen Beispiel die Raum nach „STEL“ ist das fünfte Zeichen.

Das ist mein Ausgang mit einem kurzen Namen:

Orginal string size >>9   size of name>>5 Position>> 4 
    Orginal string  >>Don 00:09 Substring >>00:09 

mit dem kürzeren Namen i perfekt meinen Zeitstempel erhalten.

Wie kann dies funktioniert konsistent. Ich habe den Rest meines Codes nicht hinzugefügt, weil dieser Teil funktioniert. Es ist im Grunde nur der Teilstring Teil, der nicht konsistent arbeitet.

Wie kann ich das beheben?

+0

Da die Zeit immer eine Größe von 5 hat, können Sie einfach 'HighScoreInfo1str (HighScoreInfo1.size() - 5);' und einfach ignorieren, was vor der Zeit ist. – DimChtz

+0

Sie könnten eine Standardgröße festlegen, füllen Sie den Namen und füllen Sie den Rest mit einigen vordefinierten Zeichen, die Sie wissen, dass Sie ignorieren müssen. –

Antwort

0

Sie berechnen test nicht richtig. Es sollte nur 1 mehr sein als die Größe des Namens, nicht die Größe von HighScoreInfo1 minus das (das ist die Länge des Zeitstempels, die Sie wissen, ist 5). Sie müssen nur 1, nicht 2 hinzufügen, da die Positionen nullbasiert sind.

int test = previous_name.size() + 1; 

DEMO

Es nur mit dem kürzeren Namen durch Zufall funktioniert, weil der Name lang 3 Zeichen sein geschieht.

0
int test = HighScoreInfo1.size() - (previous_name.size()+2); 

Dies berechnet die Länge der Zeit (die immer 5).

TimeToBeat = HighScoreInfo1.substr(test, 5); 

Dies erhält die Zeichen 5-10. Immer. Unabhängig von der Länge der Zeichenfolge. Vielleicht wollten Sie das, was die letzten fünf Bytes liest?

TimeToBeat = HighScoreInfo1.substr(HighScoreInfo1.size()-5); 
+0

das hat geholfen, thnks ... ich geuss mein gedanke war dabei umgekehrt –

Verwandte Themen