comment créer point d'arrêt conditionnel avec std :: string
-
20-09-2019 - |
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 »
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:
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'