come creare punto di interruzione condizionale con std :: string
-
20-09-2019 - |
Domanda
Supponiamo che io abbia questa funzione:
std::string Func1(std::string myString)
{
//do some string processing
std::string newString = Func2(myString)
return newString;
}
Come faccio a impostare una pausa condizionale quando newString
ha un valore specifico? (Senza cambiare la sorgente)
impostando una condizione newString == "my value"
non ha funzionato i punti di interruzione preso disabili con un errore "operatore di overload non trovato"
Soluzione
qualche ricerca è riuscito a girare su un modo per fare questo. alternative suggerite sono di mettere alla prova nel codice e aggiungere un punto di interruzione di serie:
if (myStr == "xyz")
{
// Set breakpoint here
}
O per costruire il test dai singoli confronti dei personaggi. Anche guardando i singoli caratteri nella stringa è un po 'rischiosa; in Visual Studio 2005 ho dovuto scavare nella variabili membro come
myStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z'
Nessuno di questi approcci è molto soddisfacente. Dovremmo avere un migliore accesso a una caratteristica onnipresente della libreria standard.
Altri suggerimenti
C'è un modo molto più semplice in Visual Studio 2010/2012.
Per fare quello che state cercando in ANSI utilizzare questo:
strcmp(newString._Bx._Ptr,"my value")==0
E in unicode (se fosse newString unicode) utilizzare questo:
wcscmp(newString._Bx._Ptr, L"my value")==0
Ci sono più cose che si possono fare di un semplice confronto, si può leggere di più qui:
In VS2017 si può fare
strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0
Mentre io ho avuto per ovviare a questo utilizzando qualcosa di simile alla risposta di Brad (più utilizzando DebugBreak () di rompere destra dal codice), a volte modifica / ricompilare / ri-esecuzione di un po 'di codice è troppo in termini di tempo o semplicemente impossibile.
Per fortuna, a quanto pare è possibile spelunk nelle utenti attuali della classe std :: string. Un modo è menzionato qui - e se lui chiama fuori VS2010 in particolare, è ancora possibile accedere ai singoli caratteri manualmente nelle versioni precedenti. Quindi, se si sta utilizzando il 2010, si può semplicemente utilizzare le belle funzioni strcmp()
e simili ( + info) stringa-funzioni-in-condizionale-breakpoints.aspx -Studio-debugger-2010-funzione-per-CC-sviluppatori-con-, ma se siete come me e ancora 2008 o in precedenza, si può trovare con un raggedy, terribile, ma funzionale alternativa impostando un qualcosa condizionale punto di interruzione simile:
strVar._Bx._Ptr[0] == 'a' && strVar._Bx._Ptr[1] == 'b' &&
strVar._Bx._Ptr[2] == 'c'
per rompersi se i primi tre caratteri in strVar sono "abc". Si può andare avanti con caratteri aggiuntivi, ovviamente. Brutto .. ma è mi ha salvato un po 'di tempo in questo momento.
VS2012:
Ho appena usato la condizione di seguito perché newString._Bx._Ptr
(come nella risposta di OBWANDO) riferimento alla memoria illegale
strcmp( newString._Bx._Buf, "my value")==0
e ha funzionato ...
@OBWANDO (quasi) ha la soluzione , ma come più commenti giustamente sottolineano, il buffer effettiva dipende dalla dimensione stringa; Vedo 16 ad essere la soglia. Anteponendo un controllo della dimensione della strcmp sulle opere buffer appropriati.
newString._Mysize < 16 && strcmp(newString._Bx._Buf, "test value") == 0
o
newString._Mysize >= 16 && strcmp(newString._Bx._Ptr, "ultra super long test value") == 0
In VS2017, sono stato in grado di impostare la condizione come:
strcmp(&newString[0], "my value") == 0
In VS2015 si può fare
newstring[0]=='x' && newString[1]=='y' && newString[2]=='z'
stringa Confrontando funziona meglio di confronto dei caratteri
strcmp(name._Mypair._Myval2._Bx._Buf, "foo")==0
Questo funziona, ma è molto scomodo da usare e soggetto a errori.
name._Mypair._Myval2._Bx._Buf[0] == 'f' &&
name._Mypair._Myval2._Bx._Buf[1] == '0' &&
name._Mypair._Myval2._Bx._Buf[2] == '0'