visual-studio - tag - visual studio code autocomplete html
cómo crear punto de corte condicional con std:: string (8)
Algunas búsquedas no han podido aparecer de ninguna manera para hacer esto. Las alternativas sugeridas son poner la prueba en su código y agregar un punto de corte estándar:
if (myStr == "xyz")
{
// Set breakpoint here
}
O para construir su prueba a partir de comparaciones de caracteres individuales. Incluso mirar personajes individuales en la cuerda es un poco arriesgado; en Visual Studio 2005 tuve que profundizar en las variables miembro como
myStr._Bx._Buf[0] == ''x'' && myStr._Bx._Buf[1] == ''y'' && myStr._Bx._Buf[2] == ''z''
Ninguno de estos enfoques es muy satisfactorio. Deberíamos tener un mejor acceso a una característica ubicua de la Biblioteca estándar.
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 configuro un salto condicional cuando newString
tiene un valor específico? (sin cambiar la fuente)
estableciendo una condición newString == "my value"
no funcionó los puntos de interrupción se desactivaron con un error "operador no sobrecargado no encontrado"
Aunque he tenido que trabajar en esto usando algo similar a la respuesta de Brad (más el uso de DebugBreak() para romper directamente desde el código), a veces editar / recompilar / volver a ejecutar un poco de código es demasiado lento o simplemente imposible .
Afortunadamente, aparentemente es posible adentrarse en los miembros reales de la clase std :: string. Se menciona una forma here , y aunque llama específicamente a VS2010, aún puede acceder a caracteres individuales manualmente en versiones anteriores. Entonces, si estás usando 2010, puedes usar las funciones de strcmp()
y similares ( 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 , pero si eres como yo y todavía tienes 2008 o antes, puedes inventar un juego desgarrado, terrible, pero la alternativa funcional al establecer un punto de interrupción condicional algo así como:
strVar._Bx._Ptr[0] == ''a'' && strVar._Bx._Ptr[1] == ''b'' &&
strVar._Bx._Ptr[2] == ''c''
para romper si los tres primeros caracteres en strVar son "abc". Puedes continuar con caracteres adicionales, por supuesto. Feo ... pero me ha ahorrado un poco de tiempo justo ahora.
En VS2015 puedes hacer
newstring[0]==''x'' && newString[1]==''y'' && newString[2]==''z''
En VS2017 puedes hacer
strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0
Hay una manera mucho más fácil en Visual Studio 2010/2012.
Para lograr lo que está buscando en ANSI, use esto:
strcmp(newString._Bx._Ptr,"my value")==0
Y en Unicode (si newString fuera unicode) usa esto:
wcscmp(newString._Bx._Ptr, L"my value")==0
Hay más cosas que puedes hacer que simplemente comparar, puedes leer más sobre esto aquí:
La comparación de cadenas funciona mejor que la comparación de caracteres
strcmp(name._Mypair._Myval2._Bx._Buf, "foo")==0
Esto funciona, pero es muy incómodo de usar y propenso a errores.
name._Mypair._Myval2._Bx._Buf[0] == ''f'' &&
name._Mypair._Myval2._Bx._Buf[1] == ''0'' &&
name._Mypair._Myval2._Bx._Buf[2] == ''0''
VS2012:
Acabo de utilizar la condición siguiente porque newString._Bx._Ptr
(como en la respuesta de OBWANDO) hizo referencia a la memoria ilegal
strcmp( newString._Bx._Buf, "my value")==0
Y funcionó...
@OBWANDO (casi) tiene la solución , pero como varios comentarios señalan correctamente, el buffer real depende del tamaño de la cadena; Veo que 16 es el umbral. Anteponiendo una verificación de tamaño al strcmp en el buffer apropiado funciona.
newString._Mysize < 16 && strcmp(newString._Bx._Buf, "test value") == 0
o
newString._Mysize >= 16 && strcmp(newString._Bx._Ptr, "ultra super long test value") == 0