como criar um ponto de interrupção condicional com std::string
-
20-09-2019 - |
Pergunta
Suponha que eu tenha esta função:
std::string Func1(std::string myString)
{
//do some string processing
std::string newString = Func2(myString)
return newString;
}
como faço para definir uma pausa condicional quando newString
tem um valor específico?(sem alterar a fonte)
definindo uma condição newString == "my value"
não funcionou, os pontos de interrupção foram desativados com um erro "operador sobrecarregado não encontrado"
Solução
Algumas pesquisas não conseguiram encontrar nenhuma maneira de fazer isso.As alternativas sugeridas são colocar o teste em seu código e adicionar um ponto de interrupção padrão:
if (myStr == "xyz")
{
// Set breakpoint here
}
Ou para construir seu teste a partir de comparações de personagens individuais.Até mesmo olhar para caracteres individuais na string é um pouco arriscado;no Visual Studio 2005 eu tive que me aprofundar nas variáveis de membro como
myStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z'
Nenhuma dessas abordagens é muito satisfatória.Deveríamos ter melhor acesso a um recurso onipresente da Biblioteca Padrão.
Outras dicas
Existe uma maneira muito mais fácil no Visual Studio 2010/2012.
Para realizar o que você está procurando no ANSI, use isto:
strcmp(newString._Bx._Ptr,"my value")==0
E no Unicode (se o Newstring for Unicode) use o seguinte:
wcscmp(newString._Bx._Ptr, L"my value")==0
Há mais coisas que você pode fazer do que apenas uma comparação, você pode ler mais sobre isso aqui:
No VS2017 você pode fazer
strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0
Enquanto eu tive que contornar isso usando algo semelhante à resposta de Brad (além de usar Debugbreak () Para romper com o código), às vezes editando/recompilando/renomeando um pouco de código consome muito tempo ou simplesmente impossível.
Felizmente, é aparentemente possível espalhar os membros reais da classe STD :: String. Uma maneira é mencionada aqui - E embora ele chame especificamente o VS2010, você ainda pode acessar os chars individuais manualmente em versões anteriores. Então, se você estiver usando 2010, você pode apenas usar o bom strcmp()
funções e similares (mais informações), mas se você é como eu e ainda tem 2008 ou mais cedo, pode criar uma alternativa esfarrapada, terrível, mas funcional, definindo um ponto de interrupção condicional algo como:
strVar._Bx._Ptr[0] == 'a' && strVar._Bx._Ptr[1] == 'b' &&
strVar._Bx._Ptr[2] == 'c'
quebrar se os três primeiros caracteres em Strvar forem "ABC". Você pode continuar com chars adicionais, é claro. Feio .. mas isso me salvou um pouco agora.
VS2012:
Acabei de usar a condição abaixo porque newString._Bx._Ptr
(como na resposta de Obwando) Memória ilegal referenciada
strcmp( newString._Bx._Buf, "my value")==0
E funcionou ...
@Obwando (quase) tem a solução, mas como vários comentários apontam corretamente, o buffer real depende do tamanho da string; Eu vejo 16 ser o limiar. Preparando uma verificação de tamanho para o STRCMP nas obras de buffer apropriadas.
newString._Mysize < 16 && strcmp(newString._Bx._Buf, "test value") == 0
ou
newString._Mysize >= 16 && strcmp(newString._Bx._Ptr, "ultra super long test value") == 0
No VS2017, pude definir a condição como:
strcmp(&newString[0], "my value") == 0
No vs2015 você pode fazer
newstring[0]=='x' && newString[1]=='y' && newString[2]=='z'
Comparar string funciona melhor do que comparar caracteres
strcmp(name._Mypair._Myval2._Bx._Buf, "foo")==0
Isso funciona, mas é muito inconveniente de usar e propenso a erros.
name._Mypair._Myval2._Bx._Buf[0] == 'f' &&
name._Mypair._Myval2._Bx._Buf[1] == '0' &&
name._Mypair._Myval2._Bx._Buf[2] == '0'