2010-10-04 10 views
51

कैसे पार्स करने के लिए एक स्ट्रिंग को विभाजित करने के साथ भ्रमित होने की नहीं बुद्धिमान, जैसे:
Split a string in C++?विभाजन सी ++ स्ट्रिंग्स एकाधिक पंक्तियाँ (कोड सिंटेक्स, नहीं पार्सिंग) पर

मैं कर रहा हूँ एक सा कैसे एक स्ट्रिंग को विभाजित करने के लिए के रूप में उलझन में सी ++ में कई लाइनों पर।

यह एक सरल सवाल की तरह लगता है, लेकिन निम्न उदाहरण लेते हैं:

#include <iostream> 
#include <string> 
main() { 
    //Gives error 
    std::string my_val ="Hello world, this is an overly long string to have" + 
    " on just one line"; 
    std::cout << "My Val is : " << my_val << std::endl; 

    //Gives error 
    std::string my_val ="Hello world, this is an overly long string to have" & 
    " on just one line"; 
    std::cout << "My Val is : " << my_val << std::endl; 
} 

मुझे लगता है कि मैं std::stringappend() विधि इस्तेमाल कर सकते हैं, लेकिन अगर वहाँ था किसी भी छोटी/अधिक सुरुचिपूर्ण मैं सोच रहा था (जैसे अधिक pythonlike, हालांकि स्पष्ट रूप से ट्रिपल उद्धरण आदि सी ++ में समर्थित नहीं हैं) पठनीयता के लिए कई लाइनों पर सी ++ में तार तोड़ने के तरीके।

एक जगह जहां यह विशेष रूप से वांछनीय होगा जब आप किसी फ़ंक्शन में लंबी स्ट्रिंग अक्षर पारित कर रहे हैं (उदाहरण के लिए एक वाक्य)।

+2

यहाँ एक दिलचस्प tidbit है: सी ++ lexer वास्तव में परवाह नहीं करता है कि कितने उद्धरण आप से पहले और केवल दो अपवादों के साथ एक स्ट्रिंग के बाद जगह के बारे में। आपके द्वारा उपयोग किए जाने वाले उद्धरणों की संख्या अजीब होनी चाहिए और उन्हें किसी भी तरफ मिलना चाहिए। '" "" "" यह एक वैध स्ट्रिंग है और इसे "" "" "पार्स किया जाएगा। हालांकि, इन तारों को कोई विशेष गुण नहीं दिया गया है, वे केवल एकल उद्धरणों की तरह व्यवहार करते हैं। –

+0

साझा करने के लिए दिलचस्प धन्यवाद ... क्या इसके लिए कोई उपयोगी उद्देश्य है? आप पेर्ल/बैश/पायथन स्क्रिप्ट द्वारा बाहरी पार्सिंग के लिए कोड में स्ट्रिंग के विभिन्न समूहों के लिए एक सूक्ष्म टैग के रूप में इसका उपयोग करने में सक्षम हो सकते हैं। यही वह सब है जिसके बारे में मैं सोच सकता हूं। :) –

+0

@ थॉमस एंथनी यह बस होता है क्योंकि यह अंत में उद्धरणों को खाली तारों के समूह के रूप में समझता है और उन्हें एक साथ जोड़ता है - यह एक विशेषता नहीं है, यह मानक सी/सी ++ व्यवहार – texasflood

उत्तर

88

तारों के बीच कुछ भी मत डालो। सी ++ लेक्सिंग चरण का हिस्सा आसन्न स्ट्रिंग अक्षर (यहां तक ​​कि न्यूलाइन और टिप्पणियों पर भी) को एक शाब्दिक में जोड़ना है।

#include <iostream> 
#include <string> 
main() { 
    std::string my_val ="Hello world, this is an overly long string to have" 
    " on just one line"; 
    std::cout << "My Val is : " << my_val << std::endl; 
} 

ध्यान दें कि अगर आप शाब्दिक में एक नई पंक्ति चाहते हैं, आप जोड़ना होगा कि अपने आप को:

#include <iostream> 
#include <string> 
main() { 
    std::string my_val ="This string gets displayed over\n" 
    "two lines when sent to cout."; 
    std::cout << "My Val is : " << my_val << std::endl; 
} 

आप शाब्दिक में लगातार एक #define घ पूर्णांक मिश्रण के लिए इच्छुक रहे हैं, तो आप ' ताकि आप मैक्रो के दो स्तर की जरूरत के वास्तविक मूल्य प्राप्त करने के लिए, जिस तरीके stringify प्रोसेसर ऑपरेटर काम करता है के लिए

#include <iostream> 
using namespace std; 

#define TWO 2 
#define XSTRINGIFY(s) #s 
#define STRINGIFY(s) XSTRINGIFY(s) 

int main(int argc, char* argv[]) 
{ 
    std::cout << "abc" // Outputs "abc2DEF" 
     STRINGIFY(TWO) 
     "DEF" << endl; 
    std::cout << "abc" // Outputs "abcTWODEF" 
     XSTRINGIFY(TWO) 
     "DEF" << endl; 
} 

वहाँ में कुछ weirdness है: कुछ मैक्रो का उपयोग करने के लिए होगा एक स्ट्रिंग अक्षर में TWO बनाया जाना है।

+0

है क्या आप अन्य वस्तुओं जैसे int int ? यदि नहीं, तो मैं इन्हें कैसे जोड़ूं? –

+0

@ जेसन: एक int निरंतर मिश्रण में आपका क्या मतलब है? – Eclipse

+0

my_function (arg_1, arg_2, "हैलो वर्ल्ड यह स्ट्रिंग है" TWO "लाइनें लंबी!"); –

8

क्या वे दोनों अक्षर हैं? व्हाइटस्पेस के साथ दो स्ट्रिंग अक्षर अलग करना समानता के समान है: "abc" "123""abc123" जैसा ही है। यह सीधे सी के साथ ही सी ++ पर लागू होता है।

+0

अहह इतना आसान है। धन्यवाद! –

4

मुझे नहीं पता कि यह जीसीसी में विस्तार है या यदि यह मानक है, लेकिन ऐसा लगता है कि आप बैकस्लैश के साथ लाइन को समाप्त करके एक स्ट्रिंग अक्षरशः जारी रख सकते हैं (जैसे कि अधिकांश प्रकार की रेखाएं इस में विस्तारित की जा सकती हैं सी ++ में मनोरंजक, उदाहरण के लिए एकाधिक लाइनों में फैले मैक्रो)।

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string str = "hello world\ 
    this seems to work"; 

    std::cout << str; 
    return 0; 
} 
+3

उस शाब्दिक वाक्यविन्यास में 'दुनिया' और ' – SingleNegationElimination

+0

@ टोकन मैकगुय के बीच काफी कुछ रिक्त स्थान हैं: वास्तव में ऐसा होता है, मैंने यह नहीं देखा था। अगर आप दूसरे (और बाद की) लाइनों को बाईं ओर ले जाते हैं तो ठीक करने के लिए पर्याप्त आसान है। लेकिन यह वास्तव में आपके इंडेंटिंग की उपस्थिति के साथ गड़बड़ होगा। – rmeador

+0

हाँ, यह मेरा प्रारंभिक दृष्टिकोण था, लेकिन मैंने इसे इंडेंटेशन/स्पेसिंग मुद्दों के कारण छोड़ दिया @ सिंगलेनएशन एलिमिनेशन रूपरेखा। हालांकि नोट करने के लिए अच्छा है। –

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