स्ट्रिंग में हर किरदार के लिए


229

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


9
किस प्रकार की स्ट्रिंग? सी-स्ट्रिंग, या std::string?
21

यह एक पाठ फ़ाइल से पढ़ा जाता है, इसलिए मैं std मान रहा हूँ ::
जैक विल्सन

4
किस तरह का चरित्र? char, यूनिकोड कोड बिंदु, विस्तारित अंगूर क्लस्टर?
फिलिप

जवाबों:


417
  1. लूप के लिए रेंज-आधारित (यह C ++ 11 से, पहले से ही GCC, क्लेंग और VC11 बीटा के हालिया रिलीज में समर्थित है) के पात्रों के माध्यम से लूपिंग std::string:

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

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

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

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

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

6
@ रॉबिन्सन: " जब से स्ट्रिंग स्ट्रिंग UTF8 (माना जाता है) " कब से है ?!
ऑर्बिट

2
ठीक है, ठीक है, इसकी कोई एन्कोडिंग नहीं है, हालाँकि इसे अब (विशेष रूप से वेब पर) utf8 की सर्वव्यापकता दी गई है और इस तथ्य के आधार पर कि एक पाइपलाइन या अनुप्रयोग में एक एकल सुसंगत एन्कोडिंग चाहिए, इस चर्चा के आधार पर मेरे std :: strings सभी utf8: p हैं।
रॉबिन्सन

4
@ रॉबिन्सन: और मेरे सभी को एन्कोडिंग-कम के रूप में माना जाता है क्योंकि मैं उपयोगकर्ता-सामना करने वाले डोमेन में प्रोग्रामिंग नहीं कर रहा हूं (अर्थात, मनुष्य को प्रदान किए जाने वाले कोई तार नहीं हैं)। यदि आप चरित्र एन्कोडिंग के बारे में बात करना चाहते हैं, तो आपको शीर्ष पर एक उच्च-स्तरीय अमूर्त के बारे में बात करने की आवश्यकता है std::string, जो कि बाइट्स की एक श्रृंखला है।
ऑर्बिट

1
इसके अलावा, 2 और 3 के मामले इसका अच्छा उदाहरण हैं कि आप "ऑटो" का उपयोग कैसे कर सकते हैं
गैलोज़

29

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

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];
}

मूल रूप से दो से ऊपर दो प्रकार के तार हैं जो c ++ द्वारा समर्थित हैं। दूसरे को c स्ट्रिंग कहा जाता है और पहले को std string या (c ++ string) कहा जाता है। मैं सुझाव दूंगा c ++ स्ट्रिंग, इजी टू हैंडल।


24

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

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

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

C ++ 98/03 में:

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

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


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

@BenjaminLindley: धन्यवाद! autoहमेशा एक अच्छा विचार है। इसका उपयोग करते समय, बीच का अंतर begin()और cbegin()प्रासंगिक हो जाता है।
केरेक एसबी

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

11

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

#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;
   });
}

हमारे पास वर्ष 2018 है इसलिए यह सही उत्तर होना चाहिए।
rwst

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

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

@MagnusHoff: हाँ, श्लेमल पेंटर ने अपने बदसूरत सिर को फिर से हिलाया
फ्रेड लार्सन

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

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

4

मैं "c string" के साथ लूप के लिए आधारित रेंज का उपयोग करके कोई उदाहरण नहीं देखता।

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);
}

1

सी-स्ट्रिंग ( 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;
}

1
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
        }
        //...........
    }

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

इसके अलावा, उपरोक्त कोड स्वयं व्याख्यात्मक है।


-1

आप स्ट्रिंग लाइब्रेरी के फ़ंक्शन का उपयोग करके प्रत्येक स्ट्रिंग को स्ट्रिंग में प्राप्त कर सकते हैं, जैसे मैंने इसे ऐसा किया था

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)

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