Supongamos que tengo esta función:
std::string Func1(std::string myString)
{
//do some string processing
std::string newString = Func2(myString)
return newString;
}
¿Cómo establezco una ruptura condicional cuando newString
tiene un valor específico? (sin cambiar la fuente)
establecer una condición newString == "my value"
no funcionó, los puntos de interrupción se desactivaron con un error "operador sobrecargado no encontrado"
Respuestas:
Algunas búsquedas no han podido encontrar ninguna forma de hacer esto. Las alternativas sugeridas son poner la prueba en su código y agregar un punto de interrupción estándar:
O para construir su prueba a partir de comparaciones de personajes individuales. Incluso mirar caracteres individuales en la cadena es un poco arriesgado; en Visual Studio 2005 tuve que profundizar en las variables miembro como
Ninguno de estos enfoques es muy satisfactorio. Deberíamos tener un mejor acceso a una característica omnipresente de la Biblioteca estándar.
fuente
myStr._Bx._Buf
solo es válido cuandomyStr._Mysize < _BUF_SIZE
. De lo contrario, es necesario utilizarmyStr._Bx._Ptr
strcmp(myStr._Mypair._Myval2._Bx._Ptr, "xyz") == 0
simplemente funcionaExiste una forma mucho más sencilla en Visual Studio 2010/2012.
Para lograr lo que busca en ANSI, use esto:
Y en unicode (si newString fuera unicode) use esto:
Hay más cosas que puede hacer que solo comparar, puede leer más sobre esto aquí:
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
fuente
newString._Bx._Ptr
posible que el acceso no funcione para cadenas cortas. En mi caso obtuve "Intento de leer o escribir en memoria protegida". Para cadenas cortas (¿16 caracteres o menos?),newString._Bx._Buf
Parece contener los caracteres.strcmp(newString.c_str(), "my_value") == 0
. Puede que necesite más cálculos internos, pero en mi humilde opinión es más fácil de recordar.En VS2017 puedes hacer
fuente
En VS2017, pude establecer la condición como:
fuente
Si bien tuve que solucionar esto usando algo similar a la respuesta de Brad (además de usar DebugBreak () para romper directamente con el código), a veces editar / recompilar / volver a ejecutar un poco de código consume demasiado tiempo o simplemente es imposible .
Afortunadamente, aparentemente es posible escribir en los miembros reales de la clase std :: string. Aquí se menciona una forma , y aunque menciona VS2010 específicamente, aún puede acceder a caracteres individuales manualmente en versiones anteriores. Entonces, si está usando 2010, puede usar las
strcmp()
funciones agradables y similares ( más información) , pero si es como yo y todavía tiene 2008 o antes, puede encontrar una alternativa desigual, terrible pero funcional estableciendo un punto de interrupción condicional algo como:romper si los primeros tres caracteres de strVar son "abc". Puede continuar con caracteres adicionales, por supuesto. Feo ... pero me ha ahorrado un poco de tiempo ahora.
fuente
VS2012:
Acabo de usar la condición a continuación porque
newString._Bx._Ptr
(como en la respuesta de OBWANDO) hacía referencia a la memoria ilegalY funcionó...
fuente
@OBWANDO (casi) tiene la solución , pero como señalan acertadamente varios comentarios, el búfer real depende del tamaño de la cadena; Veo que 16 es el umbral. Funciona anteponiendo una verificación de tamaño al strcmp en el búfer apropiado.
o
fuente
Intenté usar
strcmp
engdb8.1
underubuntu18.04
, pero no funciona:De acuerdo con esta respuesta ,
strcmp
es un IFUNC especial , se puede configurar una condición como esta:Es bastante feo, no quiero hacerlo la segunda vez.
Esta respuesta ofrece una solución mucho mejor, usa std :: string :: compare :
fuente
En VS2015 puedes hacer
fuente
Comparar cadenas funciona mejor que comparar caracteres
Esto funciona, pero es muy incómodo de usar y propenso a errores.
fuente
Puede convertirlo en una cadena de CA usando
c_str()
así:$_streq(myStr.c_str(), "foo")
fuente