मैं C ++ में स्ट्रिंग में प्रत्येक वर्ण पर लूप के लिए कैसे करूंगा?
char, यूनिकोड कोड बिंदु, विस्तारित अंगूर क्लस्टर?
indexजवाब में भाग के बारे में चिंता मत करो ।
मैं C ++ में स्ट्रिंग में प्रत्येक वर्ण पर लूप के लिए कैसे करूंगा?
char, यूनिकोड कोड बिंदु, विस्तारित अंगूर क्लस्टर?
indexजवाब में भाग के बारे में चिंता मत करो ।
जवाबों:
लूप के लिए रेंज-आधारित (यह C ++ 11 से, पहले से ही GCC, क्लेंग और VC11 बीटा के हालिया रिलीज में समर्थित है) के पात्रों के माध्यम से लूपिंग std::string:
std::string str = ???;
for(char& c : str) {
do_things_with(c);
}एक पुनरावृत्तियों के पात्रों के माध्यम से लूपिंग std::string:
std::string str = ???;
for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
do_things_with(*it);
}std::stringपाश के लिए एक पुराने जमाने के साथ के पात्रों के माध्यम से लूपिंग :
std::string str = ???;
for(std::string::size_type i = 0; i < str.size(); ++i) {
do_things_with(str[i]);
}अशक्त-वर्ण वर्ण सरणी के वर्णों के माध्यम से लूपिंग:
char* str = ???;
for(char* it = str; *it; ++it) {
do_things_with(*it);
}std::string, जो कि बाइट्स की एक श्रृंखला है।
एक लूप के लिए इस तरह लागू किया जा सकता है:
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 ++ स्ट्रिंग, इजी टू हैंडल।
आधुनिक 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 में उपयोग कर सकते हैं ।
autoहमेशा एक अच्छा विचार है। इसका उपयोग करते समय, बीच का अंतर begin()और cbegin()प्रासंगिक हो जाता है।
char & c) में संदर्भ की भूमिका क्या है ? क्या यह सिर्फ उस मामले में चरित्र मूल्य के संशोधन की अनुमति देने के लिए है जिसकी आवश्यकता है?
मानक एल्गोरिथ्म का उपयोग करते हुए, इसे करने का एक और तरीका है।
#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;
});
}
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
char chr = str[i];
//do something....
}
strlenलूप स्थिति में उपयोग करने के लिए यह अच्छा रूप नहीं माना जाता है , क्योंकि इसे प्रत्येक पुनरावृत्ति के लिए स्ट्रिंग पर ओ (एन) ऑपरेशन की आवश्यकता होती है, जिससे पूरे लूप ओ (एन) हो जाता है। स्ट्रिंग के आकार में ^ 2)। strlenयदि लूप के दौरान स्ट्रिंग में परिवर्तन होता है, तो लूप स्थिति के लिए कॉल किया जा सकता है, लेकिन उन मामलों के लिए आरक्षित होना चाहिए जहां वास्तव में इसकी आवश्यकता है ।
मैं "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);
}
सी-स्ट्रिंग ( 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;
}
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
}
//...........
}
एक स्ट्रिंग मूल रूप से वर्णों की एक सरणी है, इसलिए आप चरित्र प्राप्त करने के लिए सूचकांक को निर्दिष्ट कर सकते हैं। यदि आप इंडेक्स को नहीं जानते हैं, तो आप उपरोक्त कोड की तरह इसके माध्यम से लूप कर सकते हैं, लेकिन जब आप तुलना कर रहे हों, तो सुनिश्चित करें कि आप सिंगल कोट्स (जो एक वर्ण निर्दिष्ट करता है) का उपयोग करें।
इसके अलावा, उपरोक्त कोड स्वयं व्याख्यात्मक है।
आप स्ट्रिंग लाइब्रेरी के फ़ंक्शन का उपयोग करके प्रत्येक स्ट्रिंग को स्ट्रिंग में प्राप्त कर सकते हैं, जैसे मैंने इसे ऐसा किया था
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)
std::string?