2012-08-24 14 views
5
bool stringMatch(const char *expr, const char *str) { 
    // do something to compare *(expr+i) == '\\' 
    // In this case it is comparing against a backslash 
    // i is some integer 
} 

int main() { 
    string a = "a\sb"; 
    string b = "a b"; 
    cout << stringMatch(a.c_str(), b.c_str()) << endl; 
    return 1; 
} 

के बजाय शाब्दिक एक स्ट्रिंग में \ का उपयोग कर तो समस्या अभी है: Xcode '\' है, जब मैं stringMatch समारोह में डीबगिंग किया गया था, expr केवल प्रकट होता है होने के लिए 'ASB' में पढ़ने नहीं है शाब्दिक \ sb 'के बजाय।के रूप में एक भागने

और Xcode लाइन पर एक चेतावनी बाहर थूकना है: स्ट्रिंग एक = "एक \ sb": अज्ञात एस्केप अनुक्रम

संपादित करें: मैं पहले से ही "एक \\ sb" का उपयोग कर की कोशिश की है, उस में के रूप में पढ़ता शाब्दिक के रूप में "एक \\ एसबी"।

+3

http://en.cppreference.com/w/cpp/language/escape। आपका दूसरा विकल्प एक कच्ची स्ट्रिंग शाब्दिक है, लेकिन जब तक कि आप रेगेक्स या कुछ लिख नहीं रहे हैं, तो यह थोड़ा अधिक है। – chris

+0

"एक \\ एसबी" ठीक काम करना चाहिए। कृपया इसके साथ देखी गई समस्या पर विवरण पोस्ट करें। – bames53

उत्तर

6

एक्सकोड उस चेतावनी को थका रहा है क्योंकि यह एक एस्केप अनुक्रम के रूप में "ए \ एसबी" में \s की व्याख्या कर रहा है, लेकिन \s मान्य भागने का अनुक्रम नहीं है। इसे केवल s के साथ बदल दिया जाता है, इसलिए स्ट्रिंग "एएसबी" बन जाती है।

"a\\sb" जैसे बैकस्लैश से बचने का सही समाधान है। यदि यह किसी भी तरह से आपके लिए काम नहीं करता है तो कृपया उस पर अधिक जानकारी पोस्ट करें।

यहां एक उदाहरण है। आप विभिन्न उत्पादन मिलता है

4 a\sb

इसे पोस्ट करें:

#include <iostream> 
#include <string> 

int main() { 
    std::string a = "a\\sb"; 
    std::cout << a.size() << ' ' << a << '\n'; 
} 

इस कार्यक्रम का उत्पादन तरह दिखता है। अगर आपने पहले "a \\ sb" की कोशिश की तो आपने वास्तव में क्या समस्या देखी, कृपया पोस्ट करें।


रेगेक्स सी ++ में दर्द हो सकता है क्योंकि बैकस्लाश को इस तरह से बचाना होगा। सी ++ 11 में कच्चे तार हैं जो किसी भी प्रकार की भागने की अनुमति नहीं देते हैं ताकि बैकस्लैश से बचने के लिए अनावश्यक हो: R"(a\sb)"

+0

मैंने पहले से ही "a \\ sb" का उपयोग करने का प्रयास किया है, यह शाब्दिक के रूप में "a \\ sb" के रूप में पढ़ता है। – monkeyMoo

+1

डबल चेक करें, और मैंने जो उदाहरण प्रोग्राम जोड़ा है उसे आजमाएं। अगर आउटपुट अपेक्षित आउटपुट से अलग है तो पोस्ट करें। – bames53

+0

आप किस आईडीई का उपयोग कर रहे हैं? 'विजुअल स्टूडियो' या 'ब्लडशेड देवसी ++' या कुछ और? @YatingSheng –

12
bool stringMatch(const char *expr, const char *str) { 
    // do something to compare *(expr+i) == '\\' 
    // In this case it is comparing against a backslash 
    // i is some integer 
} 

int main() { 
    string a = "a\\sb"; 
    string b = "a b"; 
    cout << stringMatch(a.c_str(), b.c_str()) << endl; 
    return 1; 
} 

सी और सी ++ डिफ़ॉल्ट रूप से बचने के क्रम के रूप में बैकस्लाश के साथ सौदा करता है। आपको अपनी स्ट्रिंग में अतिरिक्त बैकस्लैश जोड़कर अपने बैकस्लैश को एस्केप अनुक्रम के रूप में उपयोग न करने के लिए सी को बताना होगा।

ये आम भागने दृश्यों हैं: - बेल (बीप)

  • \ b -

    • \ एक बैकस्पेस
    • \ च - formfeed
    • \ N - नई लाइन
    • \ आर - कैरिज रिटर्न
    • \ टी - क्षैतिज टैब
    • \\ - बैकस्लैश
    • \ '- एकल उद्धरण चिह्न
    • \ "- डबल quatation मार्क
    • \ OOO - ऑक्टल प्रतिनिधित्व
    • \ xDD - हेक्साडेसिमल Representaion

    संपादित करें: Xcode आपकी मशीन पर असामान्य रूप से व्यवहार कर रहा है । तो मैं आपको यह सुझाव दे सकता हूं।

    bool stringMatch(const char *expr, const char *str) { 
        // do something to compare *(expr+i) == '\\' 
        // In this case it is comparing against a backslash 
        // i is some integer 
    } 
    
    int main() { 
        string a = "a" "\x5C" "sb"; 
        string b = "a b"; 
        cout << stringMatch(a.c_str(), b.c_str()) << endl; 
        return 1; 
    } 
    

    string a घोषणा में रिक्त स्थान के बारे में चिंता मत करो, Xcode एक स्थान के साथ अलग तार संयोजित करता।

    संपादित करें 2: वास्तव में एक्सकोड आपके "a\\b" को सचमुच पढ़ रहा है, इस तरह यह बच निकले बैकस्लैश से संबंधित है। जब आप कंसोल के लिए string a = "a\\sb" आउटपुट करेंगे, तो आप देखेंगे, a\sb। लेकिन जब आप तर्क के रूप में या निजी सदस्य के रूप में string a पास करेंगे तो यह अतिरिक्त बैकस्लैश को सचमुच ले जाएगा। आपको इस तथ्य पर विचार करने के लिए अपना कोड डिज़ाइन करना होगा ताकि यह अतिरिक्त बैकस्लैश को अनदेखा कर सके। यह आप पर निर्भर करता है कि आप स्ट्रिंग को कैसे संभालेंगे।

    संपादित करें 3:Edit 1 आपका इष्टतम उत्तर यहां है, लेकिन यहां एक और है।

    एकल बैकस्लैश के साथ डबल बैकस्लाश को प्रतिस्थापित करने के लिए अपने stringMatch() विधि में कोड जोड़ें।

    तुम बस समारोह की शुरुआत में इस अतिरिक्त लाइन जोड़ने की जरूरत:

    expr=[expr stringByReplacingOccurrencesOfString:@"\\\\" withString:@"\\"]; 
    

    इस दोहरे बैकस्लैश समस्या का समाधान करना चाहिए।

    संपादित करें 4: कुछ लोगों को लगता संपादित 3 ObjectiveC है और इस तरह नहीं इष्टतम है, तो ObjectiveC में एक और विकल्प है ++।

    void searchAndReplace(std::string& value, std::string const& search,std::string const& replace) 
    { 
        std::string::size_type next; 
    
        for(next = value.find(search);  // Try and find the first match 
         next != std::string::npos;  // next is npos if nothing was found 
         next = value.find(search,next) // search for the next match starting after 
                  // the last match that was found. 
         ) 
        { 
         // Inside the loop. So we found a match. 
         value.replace(next,search.length(),replace); // Do the replacement. 
         next += replace.length();      // Move to just after the replace 
                     // This is the point were we start 
                     // the next search from. 
        } 
    } 
    


    संपादित 5: आप बदलना तो stringMatch() में const char * करने के लिए 'यह तुम्हारे लिए कम जटिल हो जाएगा स्ट्रिंग`।

    expr.replace(/*size_t*/ pos1, /*size_t*/ n1, /*const string&*/ str); 
    

    पीएस आपके पास अब सभी जवाब हैं, इसलिए यह आपके ऊपर है जिसे आप कार्यान्वित करते हैं जो आपको सर्वोत्तम परिणाम देता है।

  • +0

    संपादित संस्करण @YatingSheng –

    +0

    चेकआउट को यहां स्ट्रिंग शाब्दिक concatenation का उपयोग करने की आवश्यकता नहीं है; "एक \ x5 सीएसबी" काम करेगा। इसके अलावा, पुन: EDIT2, आप अतिरिक्त बैकस्लैश कहां देख रहे हैं? क्या यह डीबगर में है? क्योंकि मेरा मानना ​​है कि एक्सकोड डीबगर स्ट्रिंग्स से बच निकलता है।तो एक बैकस्लैश युक्त सही स्ट्रिंग डीबगर में दो के साथ दिखाई देनी चाहिए। यह सच होगा कि क्या आप स्ट्रिंग को "a \\ sb" या "a \ x5csb" के रूप में प्रारंभ करते हैं। वास्तविक सामग्री देखने के लिए इसे कंसोल पर प्रिंट करें। – bames53

    +0

    यही बात है, कंसोल को प्रिंट करना अतिरिक्त बैकस्लैश को दूर करता है। पुन: संपादन 2- नहीं, मैंने इसे डीबगर में नहीं देखा, यह मेरे परीक्षण मामलों के आधार पर एक निष्कर्ष है। @ bames53 –

    संबंधित मुद्दे