Kuck dir mal ganz genau an was passiert.
Sagen wir, der String tmp ist:
tmp == "Suche die Variable und löche; bis hierher"
Gut, tmp.find() gibt 10 zurück, also:
begin = 10;
Weiter im Text: in der Schleife setzt du i = begin;
also i == 10;
Dann versuchst du mit tmp.erase() was zu löschen. Allerdings ist dein Aufruf falsch! Diese Überladung löscht nicht VON der Position begin BIS i, sondern VON begin werden i Zeichen gelöscht (also 10 zeichen!). Bitte sieh dir die Referenz mal genau an:
http://www.cplusplus.com/reference/string/string/erase/
Gut, jetzt ein paar Worte zum Stil:
1) Du darfst NIEMALSNIEMAlSNIEMALSNIE ein "int" für eine Position oder für eine Größe verwenden. Dafür gibt es std::size_t.
Das ist nur scheinbar das gleiche, es ist erstens unsigned (das ist wichtig um Überläufe zu verhindern) und zweitens ist es auf 64-Bit Systemen groß genug ("int" nicht!)
2) Ich würde den ganzen Algorithmus anders ansetzen: Finde "Variable", finde ";", dann subtrahiere die beiden Positionen und lösche von "Variable" weg die richtige Anzahl der Zeichen
3) Ganz cool wäre man, wenn man in diesem Fall nicht Positionen verwenden würde, sondern sogenannte "Iteratoren". Das sind mehr oder weniger "verkrüppelte" Zeiger. Du müsstest dann allerdings eine andere funktion zum suchen verwenden: std::search
Code: Alles auswählen
#include <iostream>
#include <string>
#include <algorithm> // für std::search
#include <cassert> // nur für assert(), das brauchst du nicht
int main()
{
std::string tmp("Suche die Variable und löche; bis hierher");
std::cout<<"Ursprünglicher String: "<<tmp<<'\n';
std::string Variable("Variable");
// suche nach Variable in tmp, setze begin auf die Position
std::string::iterator begin = std::search(
tmp.begin(), tmp.end(),
Variable.begin(), Variable.end()
);
assert(begin != tmp.end()); // Wenn nicht gefunden, mach BUMM!
// suche nach Semikolon
std::string::iterator semik = std::find(tmp.begin(), tmp.end(), ';');
assert(semik != tmp.end()); // Wenn nicht gefunden, mach BUMM!
// lösche richtige Sequenz
tmp.erase(begin, semik);
std::cout<<"Resultierender String: "<<tmp<<'\n';
return 0;
}
Merke: Iteratoren sind nix anders als Zeiger, nur ein bisschen Verkrüppelt.
Man kann auch sagen Iteratoren sind für Container was Zeiger für Arrays sind.