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 Unterbrechung, wenn newString
sie einen bestimmten Wert hat? (ohne die Quelle zu ändern)
eine Bedingung setzen newString == "my value"
funktionierte nicht Die Haltepunkte wurden mit dem Fehler "Überladener Operator nicht gefunden" deaktiviert.
Antworten:
Einige Suchanfragen haben keine Möglichkeit gefunden, dies zu tun. Vorgeschlagene Alternativen sind, den Test in Ihren Code einzufügen und einen Standard-Haltepunkt hinzuzufügen:
Oder um Ihren Test aus einzelnen Charaktervergleichen aufzubauen. Sogar das Betrachten einzelner Zeichen in der Zeichenfolge ist etwas heikel. In Visual Studio 2005 musste ich mich mit den Mitgliedsvariablen wie beschäftigen
Keiner dieser Ansätze ist sehr zufriedenstellend. Wir sollten einen besseren Zugang zu einer allgegenwärtigen Funktion der Standardbibliothek haben.
quelle
myStr._Bx._Buf
das nur gültig ist, wennmyStr._Mysize < _BUF_SIZE
. Andernfalls müssen SiemyStr._Bx._Ptr
strcmp(myStr._Mypair._Myval2._Bx._Ptr, "xyz") == 0
funktioniert einfachIn Visual Studio 2010/2012 gibt es einen viel einfacheren Weg.
Verwenden Sie Folgendes, um das zu erreichen, wonach Sie in ANSI suchen:
Und in Unicode (wenn newString Unicode wäre) verwenden Sie Folgendes:
Es gibt mehr Dinge, die Sie tun können als nur einen Vergleich. Hier können Sie mehr darüber lesen:
http://blogs.msdn.com/b/habibh/archive/2009/07/07/new-visual-studio-debugger-2010-feature-for-cc-developers-using-string-functions-in-conditional- breakpoints.aspx
quelle
newString._Bx._Ptr
funktioniert der Zugriff bei kurzen Zeichenfolgen möglicherweise nicht. In meinem Fall wurde "Es wurde versucht, geschützten Speicher zu lesen oder zu schreiben". Für kurze Zeichenfolgen (16 Zeichen oder weniger?)newString._Bx._Buf
Scheint die Zeichen zu halten.strcmp(newString.c_str(), "my_value") == 0
. Könnte intern mehr Berechnung benötigen, ist aber imho leichter zu merken.In VS2017 können Sie tun
quelle
In VS2017 konnte ich die Bedingung wie folgt festlegen:
quelle
Während ich dies mit etwas ähnlichem wie Brads Antwort umgehen musste (plus DebugBreak () , um direkt aus dem Code auszubrechen), ist das Bearbeiten / Neukompilieren / erneutes Ausführen von Code manchmal entweder zu zeitaufwändig oder einfach unmöglich .
Glücklicherweise ist es anscheinend möglich, in die tatsächlichen Mitglieder der std :: string-Klasse einzusteigen. Eine Möglichkeit wird hier erwähnt - und obwohl er VS2010 speziell aufruft, können Sie in früheren Versionen immer noch manuell auf einzelne Zeichen zugreifen. Wenn Sie also 2010 verwenden, können Sie einfach die netten
strcmp()
Funktionen und dergleichen verwenden ( weitere Informationen) . Wenn Sie jedoch wie ich sind und noch 2008 oder früher haben, können Sie eine zerlumpte, schreckliche, aber funktionale Alternative finden durch Setzen einer Haltepunktbedingung wie folgt:zu brechen, wenn die ersten drei Zeichen in strVar "abc" sind. Sie können natürlich mit zusätzlichen Zeichen weitermachen. Hässlich ... aber es hat mir gerade ein wenig Zeit gespart.
quelle
VS2012:
Ich habe gerade die folgende Bedingung verwendet, weil
newString._Bx._Ptr
(wie in OBWANDOs Antwort) auf illegalen Speicher verwiesen wurdeund es hat funktioniert...
quelle
@OBWANDO hat (fast) die Lösung , aber wie mehrere Kommentare zu Recht zeigen, hängt der tatsächliche Puffer von der Zeichenfolgengröße ab. Ich sehe 16 als Schwelle. Das Voranstellen einer Größenprüfung für strcmp im entsprechenden Puffer funktioniert.
oder
quelle
Versucht,
strcmp
ingdb8.1
unter zu verwendenubuntu18.04
, aber es funktioniert nicht:Nach dieser Antwort ,
strcmp
ist eine spezielle IFUNC , kann man Bedingung wie folgt einrichten :Es ist ziemlich hässlich, ich will es nicht das zweite Mal machen.
Diese Antwort bietet eine viel bessere Lösung, sie verwendet std :: string :: compare :
quelle
In VS2015 können Sie tun
quelle
Das Vergleichen von Zeichenfolgen funktioniert besser als das Vergleichen von Zeichen
Dies funktioniert, ist jedoch sehr unpraktisch und fehleranfällig.
quelle
Sie können es
c_str()
wie folgt in einen Wechselstrom-String umwandeln :$_streq(myStr.c_str(), "foo")
quelle