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"
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.
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:
Dans VS2017, vous pouvez faire
strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0
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é ...
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.
Dans VS2017, j'ai pu définir la condition comme:
strcmp(&newString[0], "my value") == 0
@ 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
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'
Dans VS2015, vous pouvez faire
newstring[0]=='x' && newString[1]=='y' && newString[2]=='z'