2011-01-01 6 views
0

colours ist ein std::map<string, string>, wobei das erste Element jedes Paares ein 2-stelliger std::string Farbcode ist und das zweite Element der 7-stellige std::string Shell-Escape-Code für diese Farbe ist.Warum sucht und ersetzt diese Zeichenfolge segfault?

size_t i; 
for(map<string, string>::iterator iter = colours.begin(); iter != colours.end(); iter++) { 
    while((i = text.find(iter->first)) != string::npos) { 
     text.replace(i, i + sizeof(iter->first), iter->second); 
    } 
} 

Wenn dieser Code ausgeführt wird, wird das Programm segfolds. Meine beste Vermutung ist, dass es etwas damit zu tun hat, dass die Länge der Ersetzungszeichenfolge länger ist als die Länge der zu ersetzenden Zeichenfolge, aber nach meinem besten Wissen nur mit char *, nicht std::string.

Antwort

6

string::replace nimmt eine Startposition und eine Länge, keine Startposition und eine Endposition. Auch sizeof gibt die Länge einer Zeichenfolge nicht zurück. So sollte die dritte Zeile wahrscheinlich lesen:

text.replace(i, iter->first.length(), iter->second); 

Für das, was es wert ist, sizeof gibt die Menge an Stapel Raum durch das Objekt verbraucht, die zum Zeitpunkt der Kompilierung bekannt ist. Es kann also nicht von Anruf zu Anruf variieren, was die Länge der Zeichenfolge ist.

+0

Danke, ich habe die von Ihnen vorgeschlagenen Änderungen vorgenommen, aber das Programm segmentiert immer noch diesen Code. –

+0

@Not Joe Bloggs, hmm. Führen Sie einen Debugger aus, um herauszufinden, welche Bedingungen den Fehler verursachen. – luqui

+0

@Not Joe Bloggs Können Sie eine Eingabe geben, die zu einem Segfault führt? – marcog

1

@luqui bereits beantwortet, warum es segfaults, aber ich wollte etwas anderes hinzufügen.

Achten Sie darauf, dass Sie nicht in einer Endlosschleife landen, wenn Ihre Ersetzungszeichenfolge die Suchzeichenfolge enthält. Sie können dies vermeiden, indem Sie string::find() eine Position übergeben, um mit der Suche zu beginnen. Dies wird auch die Effizienz verbessern, da Ihre derzeitige Lösung zu O (N) degenerieren könnte.

+0

In diesem Fall sind die Such- und Ersetzungszeichenfolgen zum Zeitpunkt der Kompilierung bekannt. Daher kann ich sagen, dass die Ersetzungszeichenfolge definitiv nicht die Suchzeichenfolge enthält. –

Verwandte Themen