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"

Foi útil?

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:

http://blogs.msdn.com/b/habibh/archive/2009/07/07/new-visual-studio-debugger-2010-feature-for-cc-developers-useling-string-functions-in-Condicional- Breakpoints.aspx

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'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top