как создать условную точку останова с помощью std::string
-
20-09-2019 - |
Вопрос
Предположим, у меня есть эта функция:
std::string Func1(std::string myString)
{
//do some string processing
std::string newString = Func2(myString)
return newString;
}
как мне установить условный разрыв, когда newString
имеет определенную ценность ?(без изменения источника)
установка условия newString == "my value"
не сработало, точки останова были отключены с ошибкой "перегруженный оператор не найден".
Решение
Некоторые поисковые запросы не смогли найти никакого способа сделать это.Предлагаемые альтернативы - поместить тест в ваш код и добавить стандартную точку останова:
if (myStr == "xyz")
{
// Set breakpoint here
}
Или создать свой тест на основе сравнений отдельных персонажей.Даже просмотр отдельных символов в строке немного рискован;в Visual Studio 2005 мне пришлось покопаться в переменных-членах, таких как
myStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z'
Ни один из этих подходов не является очень удовлетворительным.У нас должен быть лучший доступ к вездесущей функции Стандартной библиотеки.
Другие советы
В Visual Studio 2010/2012 есть гораздо более простой способ.
Чтобы выполнить то, что вы ищете в ANSI, используйте это:
strcmp(newString._Bx._Ptr,"my value")==0
И в юникоде (если newString была юникодом) используйте это:
wcscmp(newString._Bx._Ptr, L"my value")==0
Есть больше вещей, которые вы можете сделать, чем просто сравнить, вы можете подробнее прочитать об этом здесь:
В VS2017 вы можете сделать
strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0
Хотя мне пришлось обойти это, используя что-то похожее на ответ Брэда (плюс используя Отладочный перерыв() отрываться прямо от кода), иногда редактирование / перекомпиляция / повторный запуск фрагмента кода либо отнимает слишком много времени, либо просто невозможен.
К счастью, по-видимому, возможно ввести spelunk в фактические члены класса std::string .Упоминается один из способов здесь -- и хотя он специально вызывает VS2010, вы все равно можете получить доступ к отдельным символам вручную в более ранних версиях.Так что, если вы используете 2010, вы можете просто использовать хороший strcmp()
функции и тому подобное (дополнительная информация), но если вы похожи на меня и у вас все еще есть 2008 или более ранняя версия, вы можете придумать неровную, ужасную, но функциональную альтернативу, установив условную точку останова примерно так:
strVar._Bx._Ptr[0] == 'a' && strVar._Bx._Ptr[1] == 'b' &&
strVar._Bx._Ptr[2] == 'c'
прерываться, если первые три символа в strVar являются "abc".Конечно, вы можете продолжать использовать дополнительные символы.Уродливый..но только что это сэкономило мне немного времени.
ВС2012:
Я просто использовал приведенное ниже условие, потому что newString._Bx._Ptr
( как в ответе ОБВАНДО ) ссылочная незаконная память
strcmp( newString._Bx._Buf, "my value")==0
и это сработало...
у @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
В VS2017 я смог установить условие как:
strcmp(&newString[0], "my value") == 0
В VS2015 вы можете сделать
newstring[0]=='x' && newString[1]=='y' && newString[2]=='z'
Сравнение строк работает лучше, чем сравнение символов
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'