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.

War es hilfreich?

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:

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

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'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top