2012-02-24 2 views
137

में प्रत्येक वर्ण के लिए मैं C++ में स्ट्रिंग में प्रत्येक वर्ण पर लूप के लिए कैसे करूं? पाश के लिएस्ट्रिंग

+4

स्ट्रिंग किस तरह का? सी-स्ट्रिंग, या 'std :: string'? – Mysticial

+0

यह एक टेक्स्ट फ़ाइल से पढ़ा जाता है, इसलिए मुझे लगता है कि std :: –

+3

किस प्रकार का चरित्र है? 'char', यूनिकोड कोड बिंदु, विस्तारित grapheme क्लस्टर? – Philipp

उत्तर

268
  1. एक std::string की characters के माध्यम से लूपिंग, एक सीमा के आधार पर पाश के लिए (यह सी ++ 11 से है, ALR का उपयोग कर eady जीसीसी, बजना की हाल ही में रिलीज में समर्थन किया, और VC11 बीटा):

    std::string str = ???; 
    for(char& c : str) { 
        do_things_with(c); 
    } 
    
  2. iterators के साथ एक std::string के पात्रों के माध्यम से लूपिंग:

    std::string str = ???; 
    for(std::string::iterator it = str.begin(); it != str.end(); ++it) { 
        do_things_with(*it); 
    } 
    
  3. के साथ एक std::string के पात्रों के माध्यम से लूपिंग एक पुराने ढंग के लिए लूप:

    for(std::string::size_type i = 0; i < str.size(); ++i) { 
        do_things_with(str[i]); 
    } 
    
  4. एक अशक्त-termi के पात्रों के माध्यम से लूपिंग NATed चरित्र सरणी:

    char* str = ???; 
    for(char* it = str; *it; ++it) { 
        do_things_with(*it); 
    } 
    
+0

यह मुझे कुछ हद तक भ्रमित करता है, दिया गया है std :: स्ट्रिंग यूटीएफ 8 (माना जाता है) है, इसलिए एन्कोडिंग संभवतः परिवर्तनीय लंबाई है। क्या आप स्ट्रिंग या वर्णों में बाइट्स के माध्यम से फिर से चल रहे हैं? – Robinson

+0

'std :: string' 'char' ऑब्जेक्ट्स का एक शून्य-समाप्त अनुक्रम है (परिभाषित किया गया है) है। –

+4

@ रॉबिन्सन: यह एक दोषपूर्ण धारणा है। एक बहुत ही दोषपूर्ण धारणा। इसके अलावा, "चरित्र" के कई अलग-अलग अर्थ हैं, शब्द को सख्ती से बचाना सर्वोत्तम है। – Puppy

4
const char* str = "abcde"; 
int len = strlen(str); 
for (int i = 0; i < len; i++) 
{ 
    char chr = str[i]; 
    //do something.... 
} 
+3

(पुरानी टिप्पणी, जो अभी भी ओपी के लिए प्रासंगिक है :) इसे लूप स्थिति में 'strlen' का उपयोग करने के लिए अच्छा रूप नहीं माना जाता है, क्योंकि इसे प्रत्येक पुनरावृत्ति के लिए स्ट्रिंग पर ओ (एन) ऑपरेशन की आवश्यकता होती है, जिससे पूरे स्ट्रिंग के आकार में लूप ओ (एन^2)। यदि लूप के दौरान स्ट्रिंग बदलती है, तो लूप स्थिति में 'strlen' कहा जा सकता है, लेकिन उन मामलों के लिए आरक्षित होना चाहिए जहां यह वास्तव में * आवश्यक * है। –

+0

@MagnusHoff: Yup, [Schlemiel द पेंटर] (http://en.wikipedia.org/wiki/Schlemiel_the_Painter%27s_algorithm) फिर से उसका बदसूरत सिर पीछे रखता है। –

+0

मैंने अपना जवाब संपादित कर लिया है। मैग्नस आप सही हैं, ओह पिछले कुछ वर्षों से सी # में फोरैच का उपयोग कर रहे हैं;) – demoncodemonkey

17

एक इस तरह लागू किया जा सकता:

string str("HELLO"); 
for (int i = 0; i < str.size(); i++){ 
    cout << str[i]; 
} 

इस चरित्र से स्ट्रिंग चरित्र प्रिंट होगा। str[i] सूचकांक i पर चरित्र देता है।

यदि यह एक चरित्र सरणी है:

char str[6] = "hello"; 
for (int i = 0; str[i] != '\0'; i++){ 
    cout << str[i]; 
} 

असल में उपरोक्त दो ग द्वारा ++ समर्थित तार के दो प्रकार हैं। दूसरे को सी स्ट्रिंग कहा जाता है और पहले को स्टडी स्ट्रिंग या (सी ++ स्ट्रिंग) कहा जाता है। मैं सी ++ स्ट्रिंग का उपयोग करने का सुझाव दूंगा, जो संभालने में काफी आसान है।

18

आधुनिक C++ में:

std::string s("Hello world"); 

for (char & c : s) 
{ 
    std::cout << "One character: " << c << "\n"; 
    c = '*'; 
} 

सी ++ 98/03 में:

for (std::string::iterator it = s.begin(), end = s.end(); it != end; ++it) 
{ 
    std::cout << "One character: " << *it << "\n"; 
    *it = '*'; 
} 

केवल पढ़ने के लिए यात्रा के लिए, आप सी ++ 98 में std::string::const_iterator उपयोग कर सकते हैं, और for (char const & c : s) या बस सी ++ 11 में for (char c : s)

+0

आंशिक सी ++ 11 समर्थन वाले कंपाइलर्स के लिए यहां कुछ विकल्प दिए गए हैं: http://pastebin.com/LBULsn76 –

+0

@ बेंजामिन लिंडले: धन्यवाद! 'ऑटो' हमेशा एक अच्छा विचार है। इसका उपयोग करते समय, 'प्रारंभ() 'और' cbegin() 'के बीच भेद प्रासंगिक हो जाता है। –

+0

यहां चार में संदर्भ की भूमिका क्या है ('char & c')? क्या यह केवल उस मामले में चरित्र मूल्य के संशोधन की अनुमति देने के लिए है? – LunaticSoul

0

सी-स्ट्रिंग (char []) आप इस तरह कुछ करना चाहिए के लिए:

char mystring[] = "My String"; 
int size = strlen(mystring); 
int i; 
for(i = 0; i < size; i++) { 
    char c = mystring[i]; 
} 

std::string के लिए आप str.size() उपयोग कर सकते हैं इसके आकार पाने के लिए और उदाहरण की तरह पुनरावृति, या एक इटरेटर इस्तेमाल कर सकते हैं:

std::string mystring = "My String"; 
std::string::iterator it; 
for(it = mystring.begin(); it != mystring.end(); it++) { 
    char c = *it; 
} 
0
for (int x = 0; x < yourString.size();x++){ 
     if (yourString[x] == 'a'){ 
      //Do Something 
     } 
     if (yourString[x] == 'b'){ 
      //Do Something 
     } 
     if (yourString[x] == 'c'){ 
      //Do Something 
     } 
     //........... 
    } 

एक स्ट्रिंग मूल रूप से पात्रों में से एक सरणी इसलिए आप चरित्र पाने के लिए सूचकांक निर्दिष्ट कर सकते हैं,। यदि आप इंडेक्स को नहीं जानते हैं, तो आप उपरोक्त कोड की तरह इसे लूप कर सकते हैं, लेकिन जब आप तुलना कर रहे हैं, तो सुनिश्चित करें कि आप सिंगल कोट्स (जो एक वर्ण निर्दिष्ट करता है) का उपयोग करें।

इसके अलावा, उपरोक्त कोड स्वयं स्पष्टीकरणपूर्ण है।

-2

आप स्ट्रिंग पुस्तकालय के समारोह में का उपयोग करके एक स्ट्रिंग में हर चार प्राप्त कर सकते हैं, जैसे मैं इसे इस

string words; 
    for (unsigned int i = 0; i < words.length(); i++) 
     { 
      if (words.at(i) == ' ') 
      { 
       spacecounter++; // to count all the spaces in a string 
       if (words.at(i + 1) == ' ') 
       { 
        i += 1; 
       } 
इस

पसंद आया बस अपना कोड का एक खंड है, लेकिन बात आप वर्ण का उपयोग कर सकते है stringname.at(index)

2

मानक एल्गोरिदम का उपयोग करके इसे करने का एक और तरीका है।

#include <iostream> 
#include <string> 
#include <algorithm> 

int main() 
{ 
    std::string name = "some string"; 
    std::for_each(name.begin(), name.end(), [] (char c) { 
     std::cout << c; 
    }); 
} 
1

मुझे "सी स्ट्रिंग" के साथ लूप के आधार पर किसी श्रेणी का उपयोग करके कोई उदाहरण नहीं दिखाई देता है।

char cs[] = "This is a c string\u0031 \x32 3"; 

// range based for loop does not print '\n' 
for (char& c : cs) { 
    printf("%c", c); 
} 

संबंधित नहीं लेकिन पूर्णांक सरणी उदाहरण

int ia[] = {1,2,3,4,5,6}; 

for (int& i : ia) { 
    printf("%d", i); 
} 
संबंधित मुद्दे