std :: string के साथ सशर्त ब्रेकपॉइंट कैसे बनाएं


82

मान लीजिए कि मेरा यह कार्य है:

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

newStringविशिष्ट मान होने पर मैं सशर्त विराम कैसे निर्धारित करूं ? (स्रोत बदले बिना)

एक शर्त स्थापित करना newString == "my value"

काम नहीं किया ब्रेकपॉइंट्स एक त्रुटि के साथ अक्षम हो गया "अतिभारित ऑपरेटर नहीं मिला"


1
मुझे नहीं पता कि क्या यह इरादा है, लेकिन आपका कोड टूट गया है। Func1 शून्य देता है, फिर भी आप एक std :: string लौटाते हैं। Func2 नहीं दिखाया गया है, लेकिन यह संभवतः एक std :: string नहीं लौटाता, इसके अलावा आप = (असाइनमेंट) के बजाय = (असाइनमेंट) ऑपरेटर का उपयोग कर रहे हैं।
फाल्स्ट्रो

मेरी तरफ से खराब उदाहरण, निश्चित लेकिन बिंदु यह था कि एसटीडी के साथ सशर्त ब्रेकप्वाइंट प्राप्त करने की समस्या को स्पष्ट करना :: स्ट्रिंग को काम करने के लिए
एली

जवाबों:


49

कुछ खोज ऐसा करने के किसी भी तरीके को चालू करने में विफल रहे हैं। सुझाए गए विकल्प आपके कोड में परीक्षण डालते हैं और एक मानक ब्रेकप्वाइंट जोड़ते हैं:

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

या व्यक्तिगत चरित्र तुलना से अपना परीक्षण बनाने के लिए। यहां तक ​​कि स्ट्रिंग में अलग-अलग पात्रों को देखना थोड़ा सा पासा है; दृश्य स्टूडियो 2005 में मुझे जैसे सदस्य चर में खोदना पड़ा

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

इनमें से कोई भी दृष्टिकोण बहुत संतोषजनक नहीं है। हमें मानक लाइब्रेरी की सर्वव्यापी सुविधा तक बेहतर पहुंच होनी चाहिए।


+1। मैं सिर्फ एक समान उत्तर लिख रहा था। मुझे ऐसा करने का एकमात्र तरीका कार्यान्वयन के अंदर झांकना है। ध्यान दें कि std :: string के लिए, यह शॉर्ट स्ट्रिंग ऑप्टिमाइज़ेशन के कारण काफी जटिल हो सकता है।
एड्रियन मैक्कार्थी

यह समस्या है myStr._Bx._Bufजो केवल जब मान्य है myStr._Mysize < _BUF_SIZE। अन्यथा आपको उपयोग करने की आवश्यकता हैmyStr._Bx._Ptr
RunHolt

3
यह उत्तर नए विज़ुअल स्टूडियो के लिए प्रासंगिक नहीं है। strcmp(myStr._Mypair._Myval2._Bx._Ptr, "xyz") == 0बस काम करता है
माइकल वीक्सलर

85

Visual Studio 2010/2012 में बहुत आसान तरीका है।

ANSI का उपयोग करने के लिए आप जो खोज रहे हैं उसे पूरा करने के लिए:

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

और यूनिकोड में (यदि newString यूनिकोड थे) इसका उपयोग करें:

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- breakpoints.aspx


मुझे यह जवाब पसंद है, इसने मेरे लिए काम किया (कुछ अपवादों के साथ, जहां मेमोरी सुलभ नहीं थी)।
plucked

23
जैसा कि अन्य टिप्पणियों ने सुझाव दिया है, newString._Bx._Ptrशॉर्ट स्ट्रिंग्स के लिए एक्सेस करना काम नहीं कर सकता है। मेरे मामले में मुझे "संरक्षित स्मृति को पढ़ने या लिखने का प्रयास" मिला। छोटे तार (16 वर्ण या उससे कम?) के लिए, newString._Bx._Bufवर्णों को पकड़ना प्रतीत होता है।
ववंमुरि

1
क्या यह VS2015 में भी काम करने वाला है? क्योंकि यह मेरे अंत पर काम करने के लिए नहीं लगता है ...
BmyGuest

1
मैं VS के बारे में नहीं जानता, लेकिन gdb के लिए आप लिख सकते हैं strcmp(newString.c_str(), "my_value") == 0। अधिक गणना आंतरिक की आवश्यकता हो सकती है, लेकिन याद रखना आसान है।
जौनाथेन

1
@Jounathaen दुर्भाग्य से VS में काम नहीं करता है: "इस अभिव्यक्ति के दुष्प्रभाव हैं और इसका मूल्यांकन नहीं किया जाएगा।"
Letmaik

19

VS2017 में आप कर सकते हैं

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

3
यह वास्तव में आपके द्वारा उपयोग किए जा रहे विंडोज एसडीके पर निर्भर करता है। मैं विज़ुअल स्टूडियो 2015 के साथ 10.1.15068 का उपयोग कर रहा हूं और यह काम करता है, जबकि string._Bx._Buf या string._Bx._Ptr नहीं करता है।
स्टुअर्ट वेल्च

16

VS2017 में, मैं इस स्थिति को निर्धारित करने में सक्षम था:

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

1
VS2019 में भी काम करता है, और अन्य सभी उत्तरों की तुलना में बहुत अधिक स्पष्ट और पठनीय और याद रखने में आसान है।
स्कॉट हचिंसन

8

जबकि मुझे ब्रैड के उत्तर के समान ( कोड से सही तोड़ने के लिए ) डिबगब्रेक () का उपयोग करके कुछ इसी तरह से काम करना था , कभी-कभी कोड को संपादित करना / फिर से चलाना / फिर से थोड़ा-सा कोड चलाना या तो बहुत अधिक समय लगता है या सिर्फ सादा असंभव ।

सौभाग्य से, यह स्पष्ट रूप से std :: string class के वास्तविक सदस्यों में वर्तनी के लिए संभव है। यहां एक तरीके का उल्लेख किया गया है - और हालांकि वह विशेष रूप से वीएस2010 को कॉल करता है, आप अभी भी व्यक्तिगत चर को पहले के संस्करणों में मैन्युअल रूप से एक्सेस कर सकते हैं। इसलिए यदि आप 2010 का उपयोग कर रहे हैं, तो आप केवल अच्छे strcmp()कार्यों और जैसे ( अधिक जानकारी) का उपयोग कर सकते हैं , लेकिन यदि आप मेरे जैसे हैं और अभी भी 2008 या उससे पहले के हैं, तो आप एक रैगिडी, भयानक, लेकिन कार्यात्मक विकल्प के साथ आ सकते हैं ब्रेकपॉइंट सशर्त सेट करके कुछ इस तरह:

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

तोड़ने के लिए अगर strVar में पहले तीन अक्षर "एबीसी" हैं। आप निश्चित रूप से अतिरिक्त वर्णों के साथ जा सकते हैं। बदसूरत .. लेकिन यह मुझे अभी थोड़ा समय बचा है।



3

@ वॉवैंडो (लगभग) के पास समाधान है , लेकिन जैसा कि कई टिप्पणियां सही इंगित करती हैं, वास्तविक बफर स्ट्रिंग आकार पर निर्भर करता है; मैं 16 को दहलीज देखता हूं। उचित बफर कार्यों पर स्ट्रैम्प के लिए एक आकार जांच को प्रस्तुत करना।

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

या

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

यह छोटे बफर अनुकूलन का एक परिणाम है। उच्च स्तर का अवलोकन यहाँ पर blogs.msmvps.com/gdicanio/2016/11/17/… । अधिक गहराई में यहाँ akrzemi1.wordpress.com/2014/04/14/common-optimifications
Aerom Xundes

हाँ यह सही उपाय है। जैसा कि उल्लेख किया गया है, यदि स्ट्रिंग की लंबाई 16 से कम है, तो छोटा स्ट्रिंग अनुकूलन स्मृति आवंटित नहीं करता है
सर्ज वेनस्टॉक

2

का उपयोग करने की कोशिश की strcmpमें gdb8.1के तहत ubuntu18.04है, लेकिन यह काम नहीं करता है:

(ins)(gdb) p strcmp("a", "b")
$20 = (int (*)(const char *, const char *)) 0x7ffff5179d60 <__strcmp_ssse3>

इस के अनुसार जवाब , strcmpएक विशेष है IFUNC , इस तरह एक कर सकते हैं सेटअप हालत:

condition 1 __strcmp_ssse3(camera->_name.c_str(), "ping")==0

यह बहुत बदसूरत है, इसे दूसरी बार करना नहीं चाहते।

यह उत्तर बहुत बेहतर समाधान देता है, यह std :: string :: compare का उपयोग करता है :

condition 1 camera->_name.compare("ping") == 0


1

पात्रों की तुलना की तुलना में स्ट्रिंग की तुलना बेहतर है

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'

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.