100 votes

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

Supposons que j'aie cette fonction :

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

Comment mettre en place une rupture conditionnelle lorsque newString a une valeur spécifique ? (sans changer la source)

Définition de la condition newString == "my value" n'a pas fonctionné. Les points d'arrêt ont été désactivés avec une erreur overloaded operator not found .

1 votes

Je ne sais pas si c'est le but recherché, mais votre code est cassé. Func1 renvoie void, alors que vous renvoyez une std::string. Func2 n'est pas montré, mais il ne renvoie probablement pas une std::string, de plus vous utilisez l'opérateur == (égal) plutôt que = (affectation).

0 votes

Mauvais exemple de ma part, corrigé mais le but était d'illustrer le problème de faire fonctionner un point d'arrêt conditionnel avec std::string

0 votes

98voto

OBWANDO Points 211

Il existe une méthode beaucoup plus simple dans Visual Studio 2010/2012.

Pour réaliser ce que vous recherchez en 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 à faire qu'une simple comparaison, vous pouvez en savoir plus à ce sujet ici :

http://blogs.msdn.com/b/habibh/archive/2009/07/07/new-visual-studio-debugger-2010-feature-for-c-c-developers-using-string-functions-in-conditional-breakpoints.aspx

0 votes

J'aime cette réponse, elle a fonctionné pour moi (avec quelques exceptions où la mémoire n'était pas accessible).

25 votes

Comme d'autres commentaires l'ont suggéré, l'accès newString._Bx._Ptr peut ne pas fonctionner pour les cordes courtes. Dans mon cas, j'ai obtenu "Attempted to read or write protected memory" (tentative de lecture ou d'écriture d'une mémoire protégée). Pour les chaînes courtes (16 caractères ou moins ?), newString._Bx._Buf semble retenir les personnages.

1 votes

Est-ce que cela est censé fonctionner aussi dans VS2015 ? Parce que cela ne semble pas fonctionner de mon côté...

58voto

Rai Points 74

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

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

51voto

Brad Payne Points 320

Quelques recherches n'ont pas permis de trouver un moyen d'y parvenir. Les alternatives suggérées sont de placer le test dans votre code et d'ajouter un point d'arrêt standard :

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

Ou de construire votre test à partir de comparaisons de caractères individuels. Même l'examen de caractères individuels dans la chaîne de caractères est un peu délicat ; dans Visual Studio 2005, j'ai dû 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.

0 votes

+1. J'étais justement en train d'écrire une réponse similaire. La seule façon que je connaisse de le faire est de jeter un coup d'œil à l'intérieur de l'implémentation. Notez que pour std::string, cela peut devenir assez compliqué à cause de l'optimisation des chaînes courtes.

0 votes

Le problème est que myStr._Bx._Buf n'est valable que lorsque myStr._Mysize < _BUF_SIZE . Sinon, vous devez utiliser myStr._Bx._Ptr

3 votes

Cette réponse n'est plus pertinente pour les nouvelles versions de Visual Studio. strcmp(myStr._Mypair._Myval2._Bx._Ptr, "xyz") == 0 fonctionne parfaitement

23voto

Adriel Santos Points 561

Dans VS2017, vous pouvez faire

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

8voto

Doug Kavendek Points 1244

J'ai dû contourner ce problème en utilisant quelque chose de similaire à la réponse de Brad (en plus d'utiliser DebugBreak() pour casser le code), il arrive que l'édition, la recompilation et l'exécution d'un bout de code prennent trop de temps ou soient tout simplement impossibles.

Heureusement, il est apparemment possible d'accéder aux membres de la classe std::string. Un moyen est mentionné aquí -- et bien qu'il parle spécifiquement de VS2010, vous pouvez toujours accéder à des caractères individuels manuellement dans les versions antérieures. Ainsi, si vous utilisez 2010, vous pouvez simplement utiliser la jolie fonction strcmp() et autres ( plus d'info) mais si vous êtes comme moi et que vous avez encore 2008 ou une version antérieure, vous pouvez trouver une alternative délabrée, terrible, mais fonctionnelle en mettant un point d'arrêt conditionnel quelque chose comme :

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

pour s'arrêter si les trois premiers caractères de strVar sont "abc". Vous pouvez continuer avec des caractères supplémentaires, bien sûr. C'est moche mais ça m'a fait gagner un peu de temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X