سؤال

لنفترض أن لدي هذه الوظيفة:

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 

وفي 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-cc-developers-using-string-functions-in-conditional- نقطة توقف

في VS2017 يمكنك القيام به

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

بينما اضطررت إلى العمل حول هذا باستخدام شيء مشابه لإجابة براد (بالإضافة إلى استخدام تصحيح الأخطاء () لكسر اليمين من الكود) ، يكون التحرير/إعادة تجميع/إعادة تشغيل القليل من التعليمات البرمجية إما أن يستغرق وقتًا طويلاً أو مستحيلًا للغاية.

لحسن الحظ ، من الممكن على ما يبدو Spelunk في الأعضاء الفعليين في فئة STD :: String. تم ذكر طريقة واحدة هنا - وعلى الرغم من أنه ينادي بـ VS2010 على وجه التحديد ، إلا أنه لا يزال بإمكانك الوصول إلى chars الفردية يدويًا في الإصدارات السابقة. لذلك إذا كنت تستخدم 2010 ، يمكنك فقط استخدام اللطيف strcmp() وظائف وما شابه (مزيد من المعلومات), ، ولكن إذا كنت مثلي وما زالت أمام عام 2008 أو قبل ذلك ، فيمكنك التوصل إلى بديل خشن ، فظيع ، ولكنه وظيفي عن طريق تعيين نقطة توقف مشروطة مثل:

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

لكسر إذا كانت الأحرف الثلاثة الأولى في Strvar هي "ABC". يمكنك الاستمرار مع chars إضافية ، بالطبع. قبيح .. لكنه أنقذني بعض الوقت الآن.

VS2012:

لقد استخدمت للتو الحالة أدناه بسبب 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'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top