Skip to content

মডিউল ৫-০ঃ সূচনা

আজকে সি++ এর স্ট্রিং সম্পর্কে জানতে পারবে। সি তেও তোমরা এটা শিখেছো তবে সি++ এটা কিছুটা ডিফরেন্ট। সি তে স্ট্রিং এর যে কাজগুলো অনেক কোড লিখে করতে হয়েছে এখানে সেগুলো বিল্ডইন কিছু ফাংশন দিয়ে সহজেই করে ফেলতে পারবে। সেরকম কিছু স্ট্রিং রিলেটেড বিল্ডইন ফাংশনও আজকে শেখানো হবে। সাথে ছোটখাটো কোডিং এক্সাম্পল তো আছেই। এবং লাস্টে থাকবে আইটারেশন নিয়ে আলোচনা।

মডিউল ৫-১ঃ স্ট্রিং ইন সি++

স্ট্রিং ইন C++ (Strings in C++)

C++ এ, স্ট্রিং হলো এমন একটি ডেটা টাইপ যা অক্ষরগুলির (characters) একটি ক্রম ধারণ করে। C++ এ স্ট্রিং ম্যানিপুলেশনের জন্য বিভিন্ন ফাংশন এবং ক্লাস ব্যাবহার রয়েছে।

স্ট্রিং ডেটা টাইপ (String Data Types):

C++ এ দুটি প্রধান স্ট্রিং ডেটা টাইপ রয়েছে:

  • C-স্টাইল স্ট্রিং (C-Style Strings): এগুলি character array হিসাবে ব্যাবহার করা হয় এবং একটি '\0' (null terminator) অক্ষর দ্বারা শেষ হয়।
  • C++ স্ট্রিং (C++ Strings): এগুলি std::string ক্লাস দ্বারা ব্যাবহার করা হয় এবং আরও উন্নত কার্যকারিতা প্রদান করে, যেমন : অক্ষরগুলির উপর আরও জটিল অপারেশন।

C-স্টাইল স্ট্রিং (C-Style Strings):

C-স্টাইল স্ট্রিংগুলি C++ এও ব্যবহার করা যেতে পারে, তবে সেগুলি ব্যবহার করার সময় কিছু সতর্কতা অবলম্বন করা গুরুত্বপূর্ণ:

  • মেমরি ম্যানুয়ালি পরিচালনা করতে হবে (Manual Memory Management): C-স্টাইল স্ট্রিংগুলির জন্য মেমরি অবশ্যই ম্যানুয়ালি পরিচালনা করতে হবে ।
  • নিরাপত্তা ঝুঁকির সম্ভাবনা (Potential Security Risks): C-স্টাইল স্ট্রিংগুলি বাফার ওভারফ্লো (buffer overflow) এর মতো নিরাপত্তা ঝুঁকির জন্য বেশি প্রবণ।

C++ স্ট্রিং (C++ Strings):

std::string ক্লাস C++ স্ট্রিং ম্যানিপুলেশনের জন্য আরও নিরাপদ এবং ব্যবহার করা সহজ করে তোলে। এটি নিম্নলিখিত সুবিধা প্রদান করে:

  • স্বয়ংক্রিয় মেমরি ম্যানেজমেন্ট (Automatic Memory Management): std::string অবজেক্টগুলির জন্য মেমরি স্বয়ংক্রিয়ভাবে বরাদ্দ এবং মুক্ত করা হয়।
  • নিরাপদ অপারেশন (Safe Operations): std::string ক্লাস বাফার ওভারফ্লো এবং অন্যান্য নিরাপত্তা ঝুঁকির বিরুদ্ধে সুরক্ষা প্রদান করে।
  • উন্নত কার্যকারিতা (Advanced Functionality): std::string ক্লাস স্ট্রিংগুলির উপর বিভিন্ন ধরণের অপারেশন সম্পাদন করার জন্য ফাংশন সরবরাহ করে থাকে।

উদাহরণ (Examples):

cpp
#include <iostream>

#include <string>



using namespace std;



int main() {
 // C-স্টাইল স্ট্রিং (C-Style String)
 char s1[] = "Hello";
 cout << s1 << endl; // Output: Hello

 // C++ স্ট্রিং (C++ String)
 string s2 = "World";
 cout << s2 << endl; // Output: World

 // C++ স্ট্রিং অপারেশন (C++ String Operations)
 string s3 = s1 + " " + s2;
 cout << s3 << endl; // Output: Hello World

 return 0;
}

মডিউল ৫-২ঃ String Capacity

String এর কিছু বিল্ট-ইন ফাংশনের উদাহরণ এবং ব্যাখ্যা দেওয়া হলো:

String built-in functions:

  1. s.size() -> returns the size of the string.
  2. s.max_size() -> returns the maximum size that string can hold.
  3. s.capacity() -> returns current available capacity of the string.
  4. s.clear() -> clear the string. s.empty() -> return true/false if the string is empty.
  5. s.resize() -> change the size of the string.

উদাহরণ এবং ব্যাখ্যাঃ

cpp
#include <iostream>

#include <string>



int main() {
 std::string s = "Hello, World!";

 // s.size() উদাহরণ
 std::cout << "স্ট্রিংয়ের সাইজ: " << s.size() << std::endl;
 // ব্যাখ্যা: এখানে s.size() ফাংশনটি স্ট্রিংয়ের দৈর্ঘ্য বা সাইজ রিটার্ন করবে, যা "Hello, World!" এর ক্ষেত্রে 13।

 // s.max_size() উদাহরণ
 std::cout << "স্ট্রিংয়ের সর্বোচ্চ সাইজ: " << s.max_size() << std::endl;
 // ব্যাখ্যা: s.max_size() ফাংশনটি স্ট্রিং অবজেক্টের সর্বোচ্চ সাইজ রিটার্ন করবে, যা স্ট্রিং অবজেক্ট ধারণ করতে পারে।

 // s.capacity() উদাহরণ
 std::cout << "স্ট্রিংয়ের ক্যাপাসিটি: " << s.capacity() << std::endl;
 // ব্যাখ্যা: s.capacity() ফাংশনটি স্ট্রিংয়ের বর্তমান ক্যাপাসিটি রিটার্ন করবে, অর্থাৎ স্ট্রিং অবজেক্টে ডেটা রাখার জন্য বর্তমানে কতটুকু স্থান রয়েছে।

 // s.clear() উদাহরণ
 s.clear();
 std::cout << "স্ট্রিং ক্লিয়ার করার পর সাইজ: " << s.size() << std::endl;
 // ব্যাখ্যা: s.clear() ফাংশনটি স্ট্রিংটি খালি করে দেবে, অর্থাৎ স্ট্রিংয়ের কন্টেন্ট মুছে ফেলবে।

 // s.empty() উদাহরণ
 std::cout << "স্ট্রিং কি খালি?: " << (s.empty() ? "হ্যাঁ" : "না") << std::endl;
 // ব্যাখ্যা: s.empty() ফাংশনটি চেক করবে স্ট্রিংটি খালি কিনা। যদি খালি হয় তবে true রিটার্ন করবে, না হলে false।

 // s.resize() উদাহরণ
 s.resize(10);
 std::cout << "স্ট্রিং রিসাইজ করার পর সাইজ: " << s.size() << std::endl;
 // ব্যাখ্যা: s.resize(10) ফাংশনটি স্ট্রিংটির সাইজ পরিবর্তন করে 10 করে দেবে। যদি বর্তমান সাইজ 10 এর চেয়ে ছোট হয় তবে নতুন সাইজ অনুযায়ী স্ট্রিং বড় হবে এবং অতিরিক্ত জায়গা null character দ্বারা পূর্ণ হবে।

 return 0;
}

এই উদাহরণগুলির মাধ্যমে স্ট্রিং-এর বিভিন্ন বিল্ট-ইন ফাংশনের কার্যক্রম বোঝানো হয়েছে।

Output:

Output

মডিউল ৫-৩ঃ String ইলিমেন্ট এক্সেস

String এর কিছু বিল্ট-ইন ফাংশনের উদাহরণ এবং ব্যাখ্যা দেওয়া হলো:

String built-in functions:

  1. S[i] -> access the ith index of the string.
  2. s.at(i) -> access the ith index of the string.
  3. s.back() -> access the last element of the string.
  4. s.front() -> access the first element of the string.

উদাহরণ এবং ব্যাখ্যাঃ

cpp
#include <iostream>

#include <string>



int main() {
 std::string s = "Hello, World!";

 // S[i] উদাহরণ
 std::cout << "স্ট্রিংয়ের ৭ম ইন্ডেক্সের উপাদান: " << s[7] << std::endl;
 // ব্যাখ্যা: এখানে s[7] স্ট্রিংয়ের ৭ম ইন্ডেক্সের উপাদান অ্যাক্সেস করবে, যা 'W'।

 // s.at(i) উদাহরণ
 std::cout << "স্ট্রিংয়ের ৪র্থ ইন্ডেক্সের উপাদান: " << s.at(4) << std::endl;
 // ব্যাখ্যা: s.at(4) স্ট্রিংয়ের ৪র্থ ইন্ডেক্সের উপাদান অ্যাক্সেস করবে, যা 'o'।

 // s.back() উদাহরণ
 std::cout << "স্ট্রিংয়ের শেষ উপাদান: " << s.back() << std::endl;
 // ব্যাখ্যা: s.back() স্ট্রিংয়ের শেষ উপাদান অ্যাক্সেস করবে, যা '!'।

 // s.front() উদাহরণ
 std::cout << "স্ট্রিংয়ের প্রথম উপাদান: " << s.front() << std::endl;
 // ব্যাখ্যা: s.front() স্ট্রিংয়ের প্রথম উপাদান অ্যাক্সেস করবে, যা 'H'।

 return 0;
}

এই উদাহরণগুলির মাধ্যমে স্ট্রিং-এর বিভিন্ন বিল্ট-ইন ফাংশনের কার্যক্রম বোঝানো হয়েছে।

Output:

Output

মডিউল ৫-৪ + ৫-৫ঃ String Modifiers - I + ll

String এর কিছু বিল্ট-ইন ফাংশনের উদাহরণ এবং ব্যাখ্যা দেওয়া হলো:

String built-in functions:

  1. s+= -> append another string.
  2. s.append() -> append another string.
  3. s.push_back() -> add character to the last of the string
  4. s.pop_back() -> remove the last character of the string.
  5. s= -> assign string.
  6. s.assign() -> assign string.
  7. s.erase() -> erase characters from the string.
  8. s.replace() -> replace a portion of the string.
  9. s.insert() -> insert a portion to a specific position.

উদাহরণ এবং ব্যাখ্যাঃ

cpp
#include <iostream>

#include <string>



int main() {
 std::string s = "Hello, World!";
 std::string t = " C++";

 // s+= উদাহরণ
 s += t;
 std::cout << "s+= t এর পর: " << s << std::endl;
 // ব্যাখ্যা: s += t এর মাধ্যমে s এর শেষে t যোগ করা হয়। ফলাফল "Hello, World! C++"।

 // s.append() উদাহরণ
 s.append(" Programming");
 std::cout << "s.append() এর পর: " << s << std::endl;
 // ব্যাখ্যা: s.append(" Programming") এর মাধ্যমে s এর শেষে " Programming" যোগ করা হয়। ফলাফল "Hello, World! C++ Programming"।

 // s.push_back() উদাহরণ
 s.push_back('!');
 std::cout << "s.push_back() এর পর: " << s << std::endl;
 // ব্যাখ্যা: s.push_back('!') এর মাধ্যমে s এর শেষে '!' যোগ করা হয়। ফলাফল "Hello, World! C++ Programming!"।

 // s.pop_back() উদাহরণ
 s.pop_back();
 std::cout << "s.pop_back() এর পর: " << s << std::endl;
 // ব্যাখ্যা: s.pop_back() এর মাধ্যমে s এর শেষের ক্যারেক্টারটি মুছে ফেলা হয়। ফলাফল "Hello, World! C++ Programming"।

 // s= উদাহরণ
 s = "New String";
 std::cout << "s= এর পর: " << s << std::endl;
 // ব্যাখ্যা: s = "New String" এর মাধ্যমে s এ নতুন স্ট্রিং "New String" এ অ্যাসাইন করা হয়।

 // s.assign() উদাহরণ
 s.assign("Assigned String");
 std::cout << "s.assign() এর পর: " << s << std::endl;
 // ব্যাখ্যা: s.assign("Assigned String") এর মাধ্যমে s কে "Assigned String" এ অ্যাসাইন করা হয়।

 // s.erase() উদাহরণ
 s.erase(8, 6);
 std::cout << "s.erase() এর পর: " << s << std::endl;
 // ব্যাখ্যা: s.erase(8, 6) এর মাধ্যমে s এর ৮ম ইন্ডেক্স থেকে শুরু করে ৬টি ক্যারেক্টার মুছে ফেলা হয়। ফলাফল "Assignedg"।

 // s.replace() উদাহরণ
 s.replace(0, 7, "Replaced");
 std::cout << "s.replace() এর পর: " << s << std::endl;
 // ব্যাখ্যা: s.replace(0, 7, "Replaced") এর মাধ্যমে s এর ০ম ইন্ডেক্স থেকে ৭টি ক্যারেক্টার "Replaced" দিয়ে পরিবর্তন করা হয়। ফলাফল "Replaceddg"।

 // s.insert() উদাহরণ
 s.insert(8, " String");
 std::cout << "s.insert() এর পর: " << s << std::endl;
 // ব্যাখ্যা: s.insert(8, " String") এর মাধ্যমে s এর ৮ম ইন্ডেক্সে " String" যোগ করা হয়। ফলাফল "Replaced Stringdg"।

 return 0;
}

এই উদাহরণগুলির মাধ্যমে স্ট্রিং-এর বিভিন্ন বিল্ট-ইন ফাংশনের কার্যক্রম বোঝানো হয়েছে।

Output:

Output

মডিউল ৫-৫ঃ String Iterators

নিচে একটি সি++ প্রোগ্রাম উদাহরণ এবং ব্যাখ্যা দেওয়া হলো, যেখানে iterator ব্যবহার করা হয়েছে:

কোড উদাহরণ

cpp
#include <bits/stdc++.h>

using namespace std;



int main() {
 string s;
 cin >> s;

 // for(int i=0;i<s.size();i++)
 // {
 // cout<<s[i]<<endl;
 // }
 // cout<<*s.begin()<<endl;
 // cout<<*(s.end()-1)<<endl;

 for(auto it = s.begin(); it < s.end(); it++) {
 cout << *it << endl;
 }

 return 0;
}

ব্যাখ্যা:

এই প্রোগ্রামটি একটি স্ট্রিং ইনপুট নিয়ে সেটির প্রতিটি ক্যারেক্টার আউটপুট করে। এখানে iterator ব্যবহার করা হয়েছে।

1 . স্ট্রিং ইনপুট নেওয়া:

cpp
string s;
cin >> s;

প্রোগ্রামটি প্রথমে একটি স্ট্রিংs ইনপুট নেয়।

2 . ইটারেটর ব্যাবহার না করে লুপ :

cpp
for(int i = 0; i < s.size(); i++) {
 cout << s[i] << endl;
}

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

3 . ইটারেটর শুরু ও শেষ পয়েন্ট :

cpp
cout << *s.begin() << endl;
cout << *(s.end() - 1) << endl;

এখানে s.begin() এবং s.end() ব্যবহার করে স্ট্রিংয়ের প্রথম এবং শেষ ক্যারেক্টার প্রিন্ট করার উদাহরণ দেখানো হয়েছে।

4 . ইটারেটর ব্যাবহার করে লুপ:

cpp
for(auto it = s.begin(); it < s.end(); it++) {
cout << *it << endl;
}

এই অংশে ইটারেটর ব্যবহার করে স্ট্রিংয়ের প্রতিটি ক্যারেক্টার প্রিন্ট করা হয়েছে। এখানে auto ব্যবহার করা হয়েছে, যা কম্পাইলারকে ইটারেটরের টাইপ নিজেই নির্ধারণ করতে দেয়।

  • it = s.begin() ইটারেটরকে স্ট্রিংয়ের প্রথম ক্যারেক্টারের পজিশনে সেট করে।
  • it < s.end() লুপটি চলবে যতক্ষণ না ইটারেটর স্ট্রিংয়ের শেষে পৌঁছে যায়।
  • *it বর্তমান ইটারেটরের নির্দেশিত ক্যারেক্টারকে নির্দেশ করে এবং তা প্রিন্ট করা হয়।

এই প্রোগ্রামটি দেখায় কিভাবে স্ট্রিং এর মধ্যে ইটারেটর ব্যবহার করে প্রতিটি ক্যারেক্টার অ্যাক্সেস এবং প্রিন্ট করা যায়।

মডিউল ৫-৭ঃ String Input with Spacesv

এই উদাহরণে, getline() ফাংশনটি ব্যবহার করা হয়েছে যা কনসোল থেকে স্ট্রিং ইনপুট নেয় এবং তা পরিদর্শন করে।

কোড ও উদাহরণঃ

cpp
#include <bits/stdc++.h>

using namespace std;



int main() {
 string s;
 getline(cin, s);
 cout << s << endl;
 return 0;
}

ব্যাখ্যা:

  • string s;: একটি স্ট্রিং ভেরিয়েবল ঘোষণা করা হয়েছে।
  • getline(cin, s);: getline() ফাংশনটি ব্যবহার করে কনসোল থেকে স্ট্রিং ইনপুট নেয়। এটি স্পেস সহ সমস্ত লাইন পড়ে স্ট্রিং ভেরিয়েবলে রাখে।
  • cout << s << endl;: ইনপুট নেয়া স্ট্রিং স্পেস সহ সমস্ত লাইন পরিদর্শন করে।

এই উদাহরণে, getline() ফাংশন ব্যবহার করা হয়েছে যার ফলে স্ট্রিং ইনপুটের সময় স্পেস ও গ্রহণ করা হয়।

গুরুত্বপূর্ণ নোট :

  • আপনি যদি getline() ব্যবহার করার আগে cin.ignore() ফাংশনটি ব্যবহার করেন, তবে এটি ইনপুট বাফার থেকে অবশিষ্ট অক্ষরগুলি মুছে ফেলে (যেমন আগের ইনপুট থেকে Enter কি)। এটি পরবর্তী getline() আরও সঠিকভাবে কাজ করতে সাহায্য করে।

মডিউল ৫-৮: stringstream কী

stringstream কী?

stringstream হল C++ এর একটি ক্লাস যা sstream হেডারে থাকে। এর সাহায্যে আমরা স্ট্রিংকে stream-এর মতো ব্যবহার করতে পারি — অর্থাৎ, ইনপুট/আউটপুট stream-এর মতো স্ট্রিং রিড ও রাইট করা যায়।

এক কথায়, stringstream ব্যবহার করে আমরা:

  1. একটি স্ট্রিং থেকে word বা সংখ্যা আলাদা করতে পারি।
  2. বিভিন্ন ডেটাকে স্ট্রিং আকারে গঠন করতে পারি।

stringstream দিয়ে স্ট্রিং থেকে একটি করে শব্দ বের করা

ধরা যাক, আমাদের একটি স্ট্রিং আছে: "Hello world!"

আমরা চাই এই স্ট্রিং থেকে প্রথম শব্দটি আলাদা করে নিতে। stringstream দিয়ে এটি খুব সহজভাবে করা যায়।

Code:

cpp
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main()
{
    string s = "Hello world!";

    // 1st way: স্ট্রিং সরাসরি Constructor দিয়ে stringstream তৈরি
    stringstream ss(s);

    // 2nd way: স্ট্রিং "<<" অপারেটর দিয়ে stringstream তৈরি
    // stringstream ss;
    // ss << s;
    string word;
    ss >> word;  // প্রথম শব্দটা পড়া
    cout << word << endl;  // প্রিন্ট করা
    return 0;
}

ব্যাখ্যা:

  1. string s = "Hello world!"; → একটি স্ট্রিং ঘোষণা করা হয়েছে।
  2. stringstream ss(s); → s কে stream বানানো হয়েছে।
  3. ss >> word; → stream থেকে প্রথম শব্দ (Hello) বের করে word-এ রাখা হয়েছে।
  4. cout << word; → সেই শব্দটি প্রিন্ট করা হয়েছে।

আউটপুট:

Hello

stringstream এর সকল শব্দ প্রিন্ট

যদি সব শব্দ একে একে বের করতে চাও, তাহলে নিচের মতো while লুপ ব্যবহার করা যাবে:

cpp
while (ss >> word) {
    cout << word << endl;
}

আউটপুট:

Hello
world!

C++ এ stringstream ইনপুটের দুইটি উপায়

C++ প্রোগ্রামিংয়ে যখন আমাদের কোনো স্ট্রিং থেকে শব্দ বা সংখ্যা আলাদা করে বের করতে হয়, তখন stringstream একটি অসাধারণ টুল।

এখানে আমরা দেখবো stringstream-এ ইনপুট দেওয়ার দুইটি পদ্ধতি-

পদ্ধতি ১: কনস্ট্রাক্টর দিয়ে ইনপুট দেওয়া

এটি সবচেয়ে সহজ উপায়। আমরা stringstream অবজেক্ট তৈরি করার সময়েই এর মধ্যে স্ট্রিং ইনপুট দেওয়া।

উদাহরণ:

cpp
#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
    string s = "C++ is fun";

    // stringstream-এর মধ্যে সরাসরি স্ট্রিং ইনপুট দেওয়া
    stringstream ss(s);

    string word;
    while (ss >> word) {
        cout << word << endl;
    }

    return 0;
}

আউটপুট:

C++
is
fun

ব্যাখ্যা:

  1. stringstream ss(s); → অবজেক্ট তৈরির সময়ই s স্ট্রিং ইনপুট দেওয়া হয়েছে।
  2. ss >> word; → একটি একটি করে শব্দ বের করে আনা হয়েছে।

পদ্ধতি ২: << অপারেটর দিয়ে ইনপুট দেওয়া

এই পদ্ধতিতে আমরা stringstream অবজেক্ট প্রথমে খালি বানাই, তারপর << অপারেটর দিয়ে ইনপুট দেওয়া হয়।

উদাহরণ:

cpp
#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
    string s = "Learning stringstream in C++";

    stringstream ss;
    ss << s; // এখানে ইনপুট দেওয়া হয়েছে

    string word;
    while (ss >> word) {
        cout << word << endl;
    }

    return 0;
}

আউটপুট:

Learning
stringstream
in
C++

Released under the MIT License.