web-dev-qa-db-fra.com

comment créer un point d'arrêt conditionnel avec std :: string

Supposons que j'ai cette fonction:

std::string Func1(std::string myString)
{
   //do some string processing 
   std::string newString = Func2(myString)
   return newString;  
}

comment définir un saut conditionnel lorsque newString a une valeur spécifique? (sans changer la source)

définition d'une condition newString == "my value"

n'a pas fonctionné les points d'arrêt ont été désactivés avec une erreur "opérateur surchargé introuvable"

65
Eli

Certaines recherches n'ont pas réussi à trouver le moyen de le faire. Les alternatives suggérées sont de mettre le test dans votre code et d'ajouter un point d'arrêt standard:

if (myStr == "xyz")
{
    // Set breakpoint here
}

Ou pour construire votre test à partir de comparaisons de caractères individuels. Même regarder des caractères individuels dans la chaîne est un peu risqué; dans Visual Studio 2005, je devais creuser dans les variables membres comme

myStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z'

Aucune de ces approches n'est très satisfaisante. Nous devrions avoir un meilleur accès à une fonctionnalité omniprésente de la bibliothèque standard.

44
Brad Payne

Il existe un moyen beaucoup plus simple dans Visual Studio 2010/2012.

Pour accomplir ce que vous recherchez dans ANSI, utilisez ceci:

strcmp(newString._Bx._Ptr,"my value")==0 

Et en unicode (si newString était unicode), utilisez ceci:

wcscmp(newString._Bx._Ptr, L"my value")==0 

Il y a plus de choses que vous pouvez faire qu'une simple comparaison, vous pouvez en savoir plus ici:

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

75
OBWANDO

Dans VS2017, vous pouvez faire

strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0
9
Adriel Santos

VS2012:

Je viens d'utiliser la condition ci-dessous parce que newString._Bx._Ptr(comme dans la réponse d'OBWANDO) mémoire illégale référencée

strcmp( newString._Bx._Buf, "my value")==0

et ça a marché ...

8
user2989573

Bien que j'ai dû contourner cela en utilisant quelque chose de similaire à la réponse de Brad (plus en utilisant DebugBreak () pour rompre directement avec le code), parfois éditer/recompiler/réexécuter un peu de code est soit trop de temps ou tout simplement impossible.

Heureusement, il est apparemment possible de se propager dans les membres réels de la classe std :: string. Une façon est mentionnée ici - et bien qu'il appelle spécifiquement VS2010, vous pouvez toujours accéder manuellement aux caractères individuels dans les versions antérieures. Donc, si vous utilisez 2010, vous pouvez simplement utiliser les fonctions Nice strcmp() et similaires ( plus d'informations) , mais si vous êtes comme moi et que vous avez toujours 2008 ou plus tôt , vous pouvez trouver une alternative désagréable, terrible mais fonctionnelle en définissant un point d'arrêt conditionnel quelque chose comme:

strVar._Bx._Ptr[0] == 'a' && strVar._Bx._Ptr[1] == 'b' &&
   strVar._Bx._Ptr[2] == 'c'

à casser si les trois premiers caractères de strVar sont "abc". Vous pouvez bien sûr continuer avec des caractères supplémentaires. Moche ... mais ça m'a fait gagner un peu de temps tout à l'heure.

8
Doug Kavendek

Dans VS2017, j'ai pu définir la condition comme:

strcmp(&newString[0], "my value") == 0
2
Rai

@ OBWANDO a (presque) la solution , mais comme le soulignent à juste titre plusieurs commentaires, le tampon réel dépend de la taille de la chaîne; Je vois que 16 est le seuil. L'ajout d'une vérification de taille au strcmp sur le tampon approprié fonctionne.

newString._Mysize < 16 && strcmp(newString._Bx._Buf, "test value") == 0

ou

newString._Mysize >= 16 && strcmp(newString._Bx._Ptr, "ultra super long test value") == 0
2
anik3th

La comparaison de chaînes fonctionne mieux que la comparaison de caractères

strcmp(name._Mypair._Myval2._Bx._Buf, "foo")==0

Cela fonctionne, mais est très gênant à utiliser et sujet aux erreurs.

name._Mypair._Myval2._Bx._Buf[0] == 'f' && 
name._Mypair._Myval2._Bx._Buf[1] == '0' && 
name._Mypair._Myval2._Bx._Buf[2] == '0'
1
Jas

Dans VS2015, vous pouvez faire

newstring[0]=='x' && newString[1]=='y' && newString[2]=='z'
1