2013-02-03 23 views
10

द्वारा स्ट्रिंग चार के माध्यम से Iterate मैं char द्वारा एक स्ट्रिंग चार के माध्यम से पुनरावृत्त करने का प्रयास करता हूं। मैंने इस तरह कुछ करने की कोशिश की:चार

void print(const string& infix) 
{ 
char &exp = infix.c_str(); 
while(&exp!='\0') 
{ 
     cout<< &exp++ << endl; 
    } 
} 

तो यह फ़ंक्शन कॉल प्रिंट ("हैलो"); वापसी करना चाहिए:

h 
e 
l 
l 
o 

मैं अपने कोड का उपयोग करने का प्रयास करें, लेकिन यह सब पर काम नहीं करता। बीटीडब्ल्यू पैरामीटर एक संदर्भ नहीं है एक संकेतक। धन्यवाद

+0

पैरामीटर एक संदर्भ हो सकता है, हाँ, लेकिन इतना 'exp' है । वैसे, 'std :: string' ने' ऑपरेटर [] 'अधिभारित किया है, और इसमें 'प्रारंभ()' और' end() 'फ़ंक्शंस हैं, साथ ही साथ फ़ंक्शन जोड़ी के फ्री संस्करण के साथ काम करने के लिए काम कर रहा है। – chris

+0

संभावित डुप्लिकेट [मैं स्ट्रिंग के माध्यम से कैसे पुन: प्रयास कर सकता हूं और इंडेक्स (वर्तमान स्थिति) भी जान सकता हूं?] (Http://stackoverflow.com/questions/1315041/how-can-i-iterate-through-a-string- और-इंडेक्स-वर्तमान-स्थिति) – jww

+0

संभावित डुप्लिकेट [स्ट्रिंग में प्रत्येक वर्ण के लिए] (http://stackoverflow.com/questions/9438209/for-every-character-in-string) – Csq

उत्तर

10
for(unsigned int i = 0; i<infix.length(); i++) { 
    char c = infix[i]; //this is your character 
} 

इस तरह मैंने इसे किया है। यकीन नहीं है कि यह भी "मूर्ख" है।

+0

@ उपयोगकर्ता 1 9 88385, प्रिंटिंग के लिए, यहां तक ​​कि 'std :: cout << infix; 'works। – chris

0

std::string::c_str()const char* देता है, तो आप इसे पकड़ने के लिए char& का उपयोग नहीं कर सकते। आप std::string उपयोग कर रहे हैं

void print(const string& infix) 
{ 
    const char *exp = infix.c_str(); 
    while(*exp!='\0') 
    { 
    cout << *exp << endl; 
    exp++; 
    } 
} 
+0

क्या कोई कारण है कि हम सिर्फ एक लूप (मेरे उत्तर में) पर char * का उपयोग करेंगे? मुझे कभी यकीन नहीं है कि अगर अन्य लोगों ने ऐसा किया है। –

+0

@ दवाईवतपंड्या, वास्तव में नहीं, नहीं। 'कॉन्स्ट char *' का उपयोग करके 'std :: string' को इटरेट करना मेरे लिए एक व्यर्थ प्रयास जैसा लगता है। – chris

+0

मैं कच्चे सूचक पर काम करने के बजाय इटरेटर का उपयोग करूंगा .... – billz

5

:

बेहतर उपयोग इटरेटर हालांकि:

void print(const string& infix) 
{ 
    for (auto c = infix.begin(); c!=infix.end(); ++c) 
    { 
    std::cout << *c << "\n"; 
    } 
    std::cout << std::endl; 
} 

अपने मूल कोड को ठीक करने के लिए, कोशिश भी exp सूचक पहले से ही है, तो आप संदर्भ की आवश्यकता नहीं है , वास्तव में ऐसा करने का कोई कारण नहीं है। आप iterators का उपयोग कर सकते हैं:

for (auto i = inflix.begin(); i != inflix.end(); ++i) std::cout << *i << '\n'; 

अपने मूल कोड के लिए के रूप में आप जाना चाहिए था char* बजाय char का उपयोग किया गया है और आप संदर्भ जरूरत नहीं थी।

+0

लेकिन, शायद वह न केवल इसे कॉपी करना चाहता है? उन्होंने बस पूछा कि चरित्र द्वारा स्ट्रिंग चरित्र के माध्यम से कैसे पुनरावृत्ति करें। –

+0

आप इसके साथ क्या कर रहे हैं इसके आधार पर, शायद 'कॉपी' कॉल को प्रतिस्थापित करने के लिए कुछ ऐसा है, हालांकि, यह लगभग उसी के बारे में काम करता है। – chris

+0

आउटपुट के बारे में मजाकिया बात यह है कि आप केवल 'std :: cout << infix; 'कर सकते हैं और चाहिए। हालांकि, कुछ और करने की आवश्यकता है, एक एल्गोरिदम या इटरेटर लूप काम करता है। इसके अलावा, अगर पहले से ही 'ऑटो' का उपयोग कर रहे हैं, तो मैं एक इटरेटर लूप पर लूप के लिए एक श्रेणी-आधारित का उपयोग भी करूंगा: पी – chris

16

आपका कोड एक सूचक, नहीं एक संदर्भ की जरूरत है, लेकिन एक सी ++ 11 संकलक का उपयोग कर अगर, आप सभी की जरूरत है:

void print(const std::string& infix) 
{ 
    for(auto c : infix) 
     std::cout << c << std::endl; 
} 
संबंधित मुद्दे