Подтвердить что ты не робот

Как создать условную точку останова с помощью std::string

Предположим, что у меня есть эта функция:

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

как установить условный разрыв, когда newString имеет определенное значение? (без изменения источника)

задание условия newString == "my value"

не работает, точки останова отключились с ошибкой "перегруженный оператор не найден"

4b9b3361

Ответ 1

Некоторые поиски не смогли каким-либо образом сделать это. Предлагаемые альтернативы - поставить тест в свой код и добавить стандартную точку останова:

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

Или создать свой тест из отдельных сопоставлений персонажей. Даже просмотр отдельных символов в строке немного рискован; в Visual Studio 2005 мне пришлось выкапывать переменные-члены, например

myStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z'

Ни один из этих подходов не является очень удовлетворительным. Нам лучше иметь доступ к вездесущей функции Стандартной библиотеки.

Ответ 2

В Visual Studio 2010/2012 гораздо проще.

Чтобы выполнить то, что вы ищете в ANSI, используйте это:

strcmp(newString._Bx._Ptr,"my value")==0 

И в unicode (если newString были unicode), используйте это:

wcscmp(newString._Bx._Ptr, L"my value")==0 

Есть больше вещей, которые вы можете сделать, чем просто сравнение, вы можете прочитать об этом здесь:

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

Ответ 3

В VS2017 вы можете сделать

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

Ответ 4

В то время как мне пришлось обойти это, используя что-то похожее на ответ Брэда (плюс использование DebugBreak(), чтобы сломаться прямо из кода), иногда редактирование/перекомпиляция/повторное выполнение бит кода либо слишком трудоемки, либо просто невозможно.

К счастью, это, по-видимому, возможно для использования в действительных членах класса std::string. Один из способов упоминается здесь - и, хотя он вызывает VS2010 конкретно, вы можете получить доступ к отдельным символам вручную в более ранних версиях. Поэтому, если вы используете 2010, вы можете просто использовать красивые функции strcmp() и т.д. (подробнее), но если вы как и я, и до сих пор у вас есть 2008 или более ранние версии, вы можете придумать неистовую, страшную, но функциональную альтернативу, установив условную точку останова что-то вроде:

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

если первые три символа в strVar являются "abc". Конечно, вы можете продолжать использовать дополнительные символы. Уродливо... но это спасло меня немного времени.

Ответ 5

VS2012:

Я просто использовал условие ниже, потому что newString._Bx._Ptr (как в ответе OBWANDO) ссылается на нелегальную память

strcmp( newString._Bx._Buf, "my value")==0

и он работал...

Ответ 6

У @OBWANDO (почти) есть решение, но, как справедливо указывают многочисленные комментарии, фактический буфер зависит от размера строки; Я вижу 16, чтобы быть порогом. Предварительная проверка размера в strcmp в соответствующем буфере работает.

newString._Mysize < 16 && strcmp(newString._Bx._Buf, "test value") == 0

или же

newString._Mysize >= 16 && strcmp(newString._Bx._Ptr, "ultra super long test value") == 0

Ответ 7

В VS2017 я смог установить условие как:

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

Ответ 8

В VS2015 вы можете сделать

newstring[0]=='x' && newString[1]=='y' && newString[2]=='z'

Ответ 9

Сравнение строк работает лучше, чем сравнение символов

strcmp(name._Mypair._Myval2._Bx._Buf, "foo")==0

Это работает, но очень неудобно в использовании и подвержено ошибкам.

name._Mypair._Myval2._Bx._Buf[0] == 'f' && 
name._Mypair._Myval2._Bx._Buf[1] == '0' && 
name._Mypair._Myval2._Bx._Buf[2] == '0'

Ответ 10

Так же, как и последний ответ @Richard, в VS2015 также работала нижняя строка

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

Ответ 11

Вы можете преобразовать его в строку c, используя c_str(), например так:

$_streq(myStr.c_str(), "foo")