স্ট্রিং প্রতিটি অক্ষরের জন্য


229

আমি C ++ স্ট্রিংয়ের প্রতিটি চরিত্রের লুপের জন্য কীভাবে করব?


9
কি স্ট্রিং? সি-স্ট্রিং, নাকি std::string?
রহস্যময়

এটি একটি পাঠ্য ফাইল থেকে
একটিতে পড়েছে

4
কেমন চরিত্র? char, ইউনিকোড কোড পয়েন্ট, বর্ধিত গ্রাফিয়াম গুচ্ছ?
ফিলিপ

উত্তর:


417
  1. ক এর অক্ষরগুলির মধ্য দিয়ে লুপিং করা std::string, লুপের জন্য একটি পরিসীমা-ভিত্তিক ব্যবহার করা (এটি সি ++ 11 এর, এটি ইতিমধ্যে জিসিসি, ঝনঝন এবং ভিসি 11 বিটার সাম্প্রতিক প্রকাশে সমর্থিত):

    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
@ রবিনসন: "স্টাডি :: স্ট্রিংটি ইউটিএফ 8 (ধরে নেওয়া হয়েছে) " কখন থেকে ?!
হালকাতা রেস

2
ঠিক আছে, ঠিক আছে, এর কোনও এনকোডিং নেই, তবে এখন utf8 এর সর্বব্যাপীতা দেওয়া হয়েছে (বিশেষত ওয়েবে) এবং সত্য যে এই আলোচনার ভিত্তিতে আমার পাইপলাইন বা অ্যাপ্লিকেশন জুড়ে একক ধারাবাহিক এনকোডিং চাইবে st সমস্ত utf8: পি।
রবিনসন

4
@ রবিনসন: এবং আমার সমস্তগুলিকে এনকোডিং-কম হিসাবে বিবেচনা করা হয় কারণ আমি কোনও ব্যবহারকারী-মুখী ডোমেইনে প্রোগ্রামিং করছি না (অর্থাৎ, মানুষের কাছে রচনা করার মতো কোনও স্ট্রিং নেই)) আপনি যদি চরিত্রের এনকোডিংগুলি সম্পর্কে কথা বলতে চান, আপনাকে শীর্ষে একটি উচ্চ-স্তরের বিমূর্ততা সম্পর্কে কথা বলতে হবে std::string, যা কেবল বাইটের একটি সিরিজ।
হালকা ঘোড়দৌড়

1
এছাড়াও, 2 এবং 3 টি ক্ষেত্রে আপনি কোথায় "অটো" ব্যবহার করতে পারবেন তার একটি ভাল উদাহরণ
21:40

29

A for লুপটি এভাবে প্রয়োগ করা যেতে পারে:

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

মূলত উপরের দুটিটি সি ++ দ্বারা সমর্থিত দুটি ধরণের স্ট্রিং রয়েছে। দ্বিতীয়টিকে সি স্ট্রিং বলা হয় এবং প্রথমটিকে স্টডি স্ট্রিং বা (সি ++ স্ট্রিং) বলা হয় I আমি সি ++ স্ট্রিং ব্যবহার করার পরামর্শ দেব, হ্যান্ডেল করা অনেক সহজ।


24

আধুনিক সি ++ এ:

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 = '*';
}

কেবল পঠনযোগ্য পুনরাবৃত্তির জন্য, আপনি std::string::const_iteratorC ++ 98 এবং for (char const & c : s)কেবলমাত্র for (char c : s)C ++ 11 এ ব্যবহার করতে পারেন ।


আংশিক সি ++ 11 সমর্থন সহ সংযোজনকারীদের
বেনজামিন লিন্ডলি

@ বেঞ্জামিন লিন্ডলি: ধন্যবাদ! autoসর্বদা একটি ভাল ধারণা। এটা মধ্যে পার্থক্য ব্যবহারের সময় begin()এবং cbegin()প্রাসঙ্গিক হয়ে ওঠে।
কেরেক এসবি

2
এখানে চরে রেফারেন্সের ভূমিকা কী ( char & c)? চরিত্রের মানটির প্রয়োজনের ক্ষেত্রে এটি কেবলমাত্র পরিবর্তনের অনুমতি দেওয়া?
লুনাটিকসোল

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লুপ অবস্থায় ব্যবহার করা ভাল ফর্ম হিসাবে বিবেচিত হয় না , কারণ এটি প্রতিটি পুনরাবৃত্তির জন্য স্ট্রিংয়ে একটি ও (এন) অপারেশন প্রয়োজন, পুরো লুপটিকে O (n) করে তোলে ^ 2) স্ট্রিংয়ের আকারে। strlenলুপ অবস্থায় স্ট্রিং পরিবর্তিত হয় তবে লুপের জন্য ডাকা যেতে পারে, তবে এটির ক্ষেত্রে এটি প্রয়োজনীয় যেখানে সংরক্ষণ করা উচিত ।
ম্যাগনাস হফ 21

@ ম্যাগনুসহফ: হ্যাঁ, শ্লেমিয়েল পেন্টার আবার তার কুরুচিযুক্ত মাথাটি লালন করলেন।
ফ্রেড লারসন

আমি আমার উত্তর সম্পাদনা করেছি। ম্যাগনাস তুমি ঠিক
বলেছ, উফেরা

তবে আপনার এখনও প্রতিটি পুনরাবৃত্তির শূন্যতার জন্য পরীক্ষার চেয়ে লুপের বাইরে স্ট্রেন () ব্যবহার করা উচিত।
ম্যাকেনজম

4

আমি "সি স্ট্রিং" দিয়ে লুপের উপর ভিত্তি করে ব্যাপ্তি ব্যবহার করে কোনও উদাহরণ দেখছি না।

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 অ্যারে উদাহরণ

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

স্ট্রিং লাইব্রেরির at ফাংশনটি ব্যবহার করে আপনি প্রতিটি চরকে স্ট্রিংয়ে পেতে পারেন, যেমন আমি এটি এটি করেছিলাম

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)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.