Question

Supposons que j'ai cette fonction:

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

Comment régler une pause conditionnelle lorsque newString a une valeur spécifique? (Sans changer la source)

définir une newString == "my value" condition

ne fonctionnait pas les points d'arrêt avec une ne fonctionnait plus d'erreur « opérateur surchargé introuvable »

Était-ce utile?

La solution

Certains recherche a échoué de se présenter une façon de le faire. solutions de rechange proposées sont de mettre le test dans votre code et ajouter un point d'arrêt standard:

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

Ou pour construire votre test à partir des comparaisons de caractères individuels. Même en regardant les caractères individuels dans la chaîne est un peu casse-gueule; 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 est très satisfaisante. Nous devrions avoir un meilleur accès à une caractéristique omniprésente de la bibliothèque standard.

Autres conseils

Il y a un moyen beaucoup plus facile dans Visual Studio 2010/2012.

Pour accomplir ce que vous cherchez à utiliser ANSI ceci:

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

Et en unicode (si nouvelleChaine étaient unicode), utilisez ceci:

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

Il y a plus de choses que vous pouvez faire qu'un simple comparer, vous pouvez en lire davantage ici:

http://blogs.msdn.com/b/habibh/archive/2009/07/07/new-visual-studio-debugger-2010-feature-for-cc -developers utilisant-string-fonctions-en-conditionnelle breakpoints.aspx

Dans VS2017 vous pouvez faire

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

Alors que j'ai dû contourner cela en utilisant quelque chose de similaire à la réponse de Brad (plus en utilisant DebugBreak () pour briser le droit du code), parfois l'édition / recompiler / re-exécution d'un morceau de code est trop de temps ou tout simplement impossible.

Heureusement, il est apparemment possible de spelunk dans les membres actuels de la classe std :: string. Une façon est mentionné - et bien qu'il appelle VS2010 Plus précisément, vous pouvez toujours accéder à caractères individuels manuellement dans les versions antérieures. Donc, si vous utilisez 2010, vous pouvez simplement utiliser les fonctions de strcmp() belles et similaires ( plus d'info) , mais si vous êtes comme moi et ont encore 2008 ou plus tôt, vous pouvez venir avec un haillons, terrible, mais fonctionnelle autre en définissant un conditionnel quelque chose comme point d'arrêt:

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

pour briser si les trois premiers caractères strVar sont « abc ». Vous pouvez continuer avec les caractères supplémentaires, bien sûr. Laid .. mais il m'a sauvé un peu de temps tout à l'heure.

VS2012:

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

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

et cela a fonctionné ...

@OBWANDO (presque) a solution, mais comme plusieurs commentaires soulignent à juste titre, la mémoire tampon réelle dépend de la taille de la chaîne; Je vois 16 comme le seuil. Préfixant une vérification de la taille de la strcmp sur les travaux de tampons appropriés.

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

ou

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

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

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

Dans VS2015 vous pouvez faire

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

string La comparaison fonctionne mieux que la comparaison des caractères

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

Cela fonctionne, mais il est très peu pratique à utiliser et sujette aux erreurs.

name._Mypair._Myval2._Bx._Buf[0] == 'f' && 
name._Mypair._Myval2._Bx._Buf[1] == '0' && 
name._Mypair._Myval2._Bx._Buf[2] == '0'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top