So erstellen Sie einen bedingten Haltepunkt mit STD :: String
-
20-09-2019 - |
Frage
Angenommen, ich habe diese Funktion:
std::string Func1(std::string myString)
{
//do some string processing
std::string newString = Func2(myString)
return newString;
}
Wie setze ich eine bedingte Pause, wenn newString
Hat ein bestimmter Wert? (ohne die Quelle zu ändern)
Bedingung einstellen newString == "my value"
Die Haltepunkte wurden nicht mit einem Fehler "überladener Bediener nicht gefunden" deaktiviert.
Lösung
Einige Suche haben es nicht geschafft, dies zu tun. Vorgeschlagene Alternativen sollen den Test in Ihren Code einfügen und einen Standard -Haltepunkt hinzufügen:
if (myStr == "xyz")
{
// Set breakpoint here
}
Oder um Ihren Test aus einzelnen Charaktervergleiche aufzubauen. Selbst wenn Sie sich einzelne Zeichen in der Zeichenfolge betrachten, ist ein bisschen Würfel. In Visual Studio 2005 musste ich mich in die Mitgliedsvariablen wie ein graben
myStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z'
Keiner dieser Ansätze ist sehr zufriedenstellend. Wir sollten einen besseren Zugang zu einer allgegenwärtigen Funktion der Standardbibliothek haben.
Andere Tipps
In Visual Studio 2010/2012 gibt es viel einfacher.
Um das zu erreichen, wonach Sie in ANSI suchen, verwenden Sie dies:
strcmp(newString._Bx._Ptr,"my value")==0
Und in Unicode (wenn Newstring Unicode war) verwenden Sie Folgendes:
wcscmp(newString._Bx._Ptr, L"my value")==0
Es gibt mehr Dinge, die Sie tun können, als nur einen Vergleich. Sie können hier mehr darüber lesen:
In VS2017 können Sie tun
strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0
Ich musste dies mit etwas ähnlichem wie Brads Antwort herumarbeiten (plus mit Verwendung Debugbreak () Um direkt aus dem Code zu brechen), ist es entweder zu zeitaufwändig oder einfach nur unmöglich.
Glücklicherweise ist es anscheinend möglich, in die tatsächlichen Mitglieder der Std :: String -Klasse einzusteigen. Ein Weg wird erwähnt hier - und obwohl er VS2010 speziell ausruft, können Sie in früheren Versionen immer noch manuell auf einzelne Zeichen zugreifen. Wenn Sie also 2010 verwenden, können Sie einfach die Schöne verwenden strcmp()
Funktionen und dergleichen (Mehr Info), Aber wenn Sie wie ich sind und noch 2008 oder früher haben, können Sie sich eine zerlumpte, schreckliche, aber funktionale Alternative einfallen lassen, indem Sie einen Breakpoint -Bedingung einstellen, was so etwas wie folgt:
strVar._Bx._Ptr[0] == 'a' && strVar._Bx._Ptr[1] == 'b' &&
strVar._Bx._Ptr[2] == 'c'
Um zu brechen, wenn die ersten drei Zeichen in Strvar "ABC" sind. Natürlich können Sie mit zusätzlichen Zeichen weitermachen. Hässlich .. Aber es hat mir gerade ein wenig Zeit gerettet.
Vs2012:
Ich habe gerade den Zustand unten verwendet, weil newString._Bx._Ptr
(wie in Obwandos Antwort) referenzierte illegale Erinnerung
strcmp( newString._Bx._Buf, "my value")==0
und es hat funktioniert...
@Obwando (fast) hat die Lösung, Aber wie mehrere Kommentare zu Recht darauf hinweisen, hängt der tatsächliche Puffer von der Zeichenfolgengröße ab. Ich sehe 16 die Schwelle. Vorbereitung einer Größenüberprüfung an die STRCMP auf den entsprechenden Pufferarbeiten.
newString._Mysize < 16 && strcmp(newString._Bx._Buf, "test value") == 0
oder
newString._Mysize >= 16 && strcmp(newString._Bx._Ptr, "ultra super long test value") == 0
In VS2017 konnte ich den Zustand als:
strcmp(&newString[0], "my value") == 0
In VS2015 können Sie tun
newstring[0]=='x' && newString[1]=='y' && newString[2]=='z'
Der Vergleich der Zeichenfolge funktioniert besser als die Vergleich von Zeichen
strcmp(name._Mypair._Myval2._Bx._Buf, "foo")==0
Dies funktioniert, ist aber sehr unpraktisch zu verwenden und zu fehleranfällig.
name._Mypair._Myval2._Bx._Buf[0] == 'f' &&
name._Mypair._Myval2._Bx._Buf[1] == '0' &&
name._Mypair._Myval2._Bx._Buf[2] == '0'