3 Stimmen

Warum gibt std::string.find(text,std::string:npos) nicht npos zurück?

Ich mache eine Reihe von Suchvorgängen in einer Zeichenfolge, und irgendwann wird eine der Zeichenfolgen übersehen, und meine Reihe von Suchvorgängen sollte fehlschlagen.

Ich hatte erwartet, dass die Position, sobald sie std::string::npos erreicht hat, dort bleiben würde, aber das ist nicht der Fall. Die Übergabe von std::string::npos an std::string.find scheint die Suche wieder am Anfang zu beginnen

std::string str("frederick");
std::string::size_type pos = str.find("der",std::string::npos);
TS_ASSERT_EQUALS(pos, std::string::npos); // FAIL, 3 is returned

Warum wird es nicht als Ende der Zeichenkette verstanden?

Aktualisieren: Die Absicht ist, nach einer Reihe von Zeichenfolgen zu suchen und das Ergebnis am Ende zu überprüfen

pos = str.find(string1, pos)
pos = str.find(string2, pos)
pos = str.find(string3, pos)
if (pos != std:string::npos)
{ // All strings found

0voto

Idan K Punkte 19903

Die Übergabe von std::string::npos als zweites Argument an find bedeutet, dass die Suche an oder nach der Position std::string::npos in der Zeichenkette beginnt.

Das ist eindeutig nicht das, was Sie beabsichtigt haben.

EDIT:

Dies könnte das bewirken, was Sie ursprünglich beabsichtigt haben:

string s;
string::size_type pos;

if ((pos = s.find(s1)) != string::npos && (pos = s.find(s2, pos)) != npos && 
    (pos = s.find(s3,pos)) != string::npos)
{
    // okay
}

Ich habe es nicht getestet, aber es sollte funktionieren. Vielleicht bevorzugen Sie den Peterchen-Stil, da er besser lesbar ist.

0voto

Paolo Tedesco Punkte 52228

Sie sollten vielmehr die Länge der Zeichenkette als Ausgangsposition verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X