মডিউল ১১ঃ স্ট্রিং অপারেশন
মডিউল ১১-০ঃসূচনা
আজকে স্ট্রিং রিলেটেড বেসিক অপারেশন গুলো নিয়ে আলোচনা করা হবে। কিভাবে স্ট্রিং কপি করতে হয়, কিভাবে দুইটা স্ট্রিং যোগ করে আরেকটা নতুন স্ট্রিং ক্রিয়েট করতে হয় এবং স্ট্রিং কম্পারিজন এই স্ট্রিং অপারেশন গুলো লজিক্যালি কোডের মাধ্যমে এবং বিল্ডইন ফাংশন ইউস করে দুইভাবেই দেখানো হবে।
মডিউল ১১-১,১১-২,১১-৩ঃ স্ট্রিং কপি
এখন আমরা একটি স্ট্রিং কপি করে আরেকটি স্ট্রিং এ নিয়ে যাব। এটা আমরা খুব সিম্পলি একটি লুপ চালিয়ে করে ফেলতে পারি। যেই স্ট্রিং টিকে কপি করতে চাচ্ছি সেই স্ট্রিং টির উপর লুপ চালাবো। লুপ চালিয়ে সেই স্ট্রিং টির প্রতিটি ইন্ডেক্সে যেয়ে ওই ইন্ডেক্সে থাকা ভেলুটি কপি করে যেই স্ট্রিং এ রাখতে চাচ্ছি ওটার সেইম ইন্ডেক্সে রেখে দিতে পারি।
Code (Manual String Copy):
#include <stdio.h>
#include <string.h> // strlen ফংশন ব্যাবহার করা হচ্ছে তাই এটি ইনক্লুড করতে হয়েছে।
int main()
{
char a[100],b[100];
scanf("%s %s", &a , &b); // দুটি স্ট্রিং ইনপুট নিচ্ছি।
for(int i=0; i<=strlen(b); i++) // আমরা দ্বিতীয় স্ট্রিং টি কপি করে প্রথম স্ট্রিং এ রাখতে চাচ্ছি। তাই দ্বিতীয় স্ট্রিং এর উপর লুপ চালানো হচ্ছে। লুপ চালাচ্ছি ০ থেকে দ্বিতীয় স্ট্রিং এর লেন্থ পর্যন্ত, কারন আমরা চাচ্ছি নাল ও কপি করে প্রথম স্ট্রিং এ রাখব।
{
a[i] = b[i]; // প্রতিটি ইন্ডেক্সে যেয়ে ওই ইন্ডেক্সের ভেলু প্রথম স্ট্রিং এর সেইম ইন্ডেক্সে রেখে দিচ্ছি।
}
printf("%s %s",a,b); // এভাবে লুপ শেষে পুরো স্ট্রিং টিই কপি হয়ে যাবে। প্রিন্ট করলে দেখব দুটি স্ট্রিং ই সেইম আউটপুট দিচ্ছে।
return 0;
}এবার এই সেইম কাজটি আমরা বিল্ট-ইন ফাংশন ব্যাবহার করে করব।
স্ট্রিং কপি করার জন্য সি প্রোগ্রামিং এ একটি বিল্ট-ইন ফাংশন আছে। strcpy() এই ফাংশনের মধ্যে দুটি স্ট্রিং দিতে হয়। তাহলে এই ফাংশন দ্বিতীয় স্ট্রিং টি কপি করে এনে প্রথম স্ট্রিং এ বসিয়ে দেয়。
Code (Using strcpy):
#include <stdio.h>
#include <string.h>
int main()
{
char a[100],b[100];
scanf("%s %s", &a , &b);
strcpy(a,b); // এই ফাংশন দ্বিতীয় স্ট্রিং টি কপি করে এনে প্রথম স্ট্রিং এ বসিয়ে দেয়।
printf("%s %s",a,b);
return 0;
}বিল্ট-ইন ফাংশন ব্যাবহার করার আগে আমরা নিজেরা করে দেখেছি যাতে আমরা বুঝতে পারি এই বিল্ট-ইন ফাংশনগুলো কিভাবে কাজ করে।
মডিউল ১১-৪,১১-৫,১১-৬ঃ স্ট্রিং কনকেটিনেশন
এবার আমরা দেখব কিভাবে একটি স্ট্রিংকে আরেকটি স্ট্রিং এর সাথে কনকেট করা যায় অর্থাৎ শেষে এড করে দেওয়া যায়।
সিম্পলি লুপ চালিয়ে করে ফেলতে পারি আমরা। এক্ষেত্রে প্রথম স্ট্রিং এর ক্ষেত্রে লুপ চালানো শুরু করতে পারি প্রথম স্ট্রিং এর লেন্থ থেকে, কারন আমরা এই স্ট্রিং এর লেন্থ থেকে নতুন স্ট্রিং এড করা শুরু করব। আর দ্বিতীয় স্ট্রিং এর ক্ষেত্রে লুপ চালানো শুরু করতে পারি ০ থেকে, কারন এই স্ট্রিং এর শুরু থেকেই এড হতে থাকবে প্রথম স্ট্রিং এ।
Code (Manual String Concatenation):
#include <stdio.h>
#include <string.h>
int main()
{
char a[200],b[100];
scanf("%s %s",a,b); // দুটি স্ট্রিং ইনপুট নেওয়া হচ্ছে।
int k=strlen(a); // প্রথম স্ট্রিং এর লেন্থ বের করে একটি ভেরিয়েবলে স্টোর করে রাখা হচ্ছে। পরবর্তীতে এই ভেরিয়েবল দিয়েই প্রথম স্ট্রিং এর জন্য লুপ চালানো হবে।
for(int i=0; i<=strlen(b); i++) // ০ থেকে দ্বিতীয় স্ট্রিং এর লেন্থ পর্যন্ত লুপ চালানো হচ্ছে।
{
a[k]=b[i]; // প্রথম স্ট্রিং এর লেন্থ এর পর থেকে একটি একটি করে দ্বিতীয় স্ট্রিং এর সবগুলো ক্যারেক্টার রেখে দেওয়া হচ্ছে। লুপ এখন প্রথম স্ট্রিং এর কোন ইন্ডেক্সে আছে তা ট্রাক রাখার জন্য k ভেরিয়েবলটি ব্যাবহার করা হচ্ছে।
k++; // প্রতিবার k এর মান ১ করে বাড়ানো হচ্ছে।
}
printf("%s %s",a,b); // লুপ শেষে প্রিন্ট করলে দেখা যাবে প্রথম স্ট্রিং এর শেষে দ্বিতীয় স্ট্রিং এড হয়ে গিয়েছে।
return 0;
}এবার আমরা এই কনকেট করার কাজটি একটি বিল্ট-ইন ফাংশন ব্যাবহার করে করব।
ফাংশনটি হলো strcat()। এই ফাংশনে দুটি স্ট্রিং দেওয়া হয়, সে দ্বিতীয় স্ট্রিংটি প্রথম স্ট্রিং এর শেষে এড করে দেয়।
Code (Using strcat):
#include <stdio.h>
#include <string.h>
int main()
{
char a[200],b[100];
scanf("%s %s",a,b);
strcat(a,b); // প্রথম স্ট্রিং এর শেষে দ্বিতীয় স্ট্রিং পুরোটা এড হয়ে যাবে।
printf("%s %s",a,b);
return 0;
}মডিউল ১১-৭, ১১-৮.১১-৯,১১-১০ঃ স্ট্রিং লেক্সিকোগ্রাফিকাল কম্পারিসন
এবার আমরা দুটো স্ট্রিংকে লেক্সিকোগ্রাফিকালি কম্পেয়ার করে বের করব দুটি স্ট্রিং এর মধ্যে কোনটি ছোট আর কোনটি বড়। লেক্সিকোগ্রাফিকালি কম্পেয়ার মূলত ডিকশনারি সিরিয়াল ফলো করে। a,b,c,d....x,y,z এই সিরিয়াল অনুযায়ী লেক্সিকোগ্রাফিকাল কম্পেয়ারিজন হয়।
এখানে আমাদের কাছে দুটো স্ট্রিং থাকবে। আমরা লুপ চালিয়ে দুটি স্ট্রিং ই চেক করতে থাকব। আমরা লুপ থামিয়ে দিব যদিঃ
- কোন স্ট্রিং শেষ হয়ে যায়।
- যদি দুটি স্ট্রিং এর মধ্যে অমিল পাওয়া যায়।
যদি কোন স্ট্রিং শেষ হয়ে যায় অন্য আরেকটির আগে তাহলে বুঝা যাবে ওটাই ছোট স্ট্রিং। আর যদি দুটি একসাথে শেষ হয় তাহলে দুটোই সমান।
আর যদি দুটি স্ট্রিং এর মধ্যে অমিল পাওয়া যায় তাহলে চেক করে দেখব অমিল পাওয়া ক্যারেক্টার গুলোর মধ্যে কোন স্ট্রিং এর ক্যারেক্টারটি ছোট। যেটি ছোট হবে ওই স্ট্রিংটিই ছোট হবে।
এবার এই লজিকটি কোডে করে ফেলি আমরাঃ
Code (Manual String Comparison):
#include <stdio.h>
int main()
{
char a[100],b[100];
scanf("%s %s",a,b); // দুটি স্ট্রিং ইনপুট নেওয়া হচ্ছে
int i=0;
while(1) // এখানে আমাদের লুপ থামিয়ে দেওয়ার অনেকগুলো কন্ডিশন আছে। সবগুলো কন্ডিশন শুরুতে লিখে ফেলাটা ভালো দেখাবে না তাই এখানে আমরা ইনফাইনাইট লুপ চালাচ্ছি। লুপের ভিতর যখনি থেমে যাওয়ার কন্ডিশন মিলে যাবে তখন আমরা ব্রেক করে লুপ থামিয়ে দিব।
{
if(a[i]=='\0' && b[i]=='\0') // প্রথমেই চেক করছি দুটো স্ট্রিং ই শেষ কিনা অর্থাৎ আমরা দুটো স্ট্রিং এর ই নালে চলে আসছি কিনা।
{
printf("Same\n"); // যদি দুটো স্ট্রিং ই শেষ হয়ে যায় তাহলে দুটো স্ট্রিং ই সেইম।
break; // ব্রেক করে লুপ থামিয়ে দেওয়া হচ্ছে।
}
else if(a[i]=='\0') // উপরের কন্ডিশনটি সত্য হয় নি তাই এবার আমরা চেক করছি শুধু প্রথম স্ট্রিংটি শেষ হয়েছে কিনা
{
printf("A choto\n"); // যদি প্রথম স্ট্রিংটি শেষ হয়ে থাকে তাহলে এটিই ছোট।
break; // ব্রেক করে লুপ থামিয়ে দেওয়া হচ্ছে।
}
else if(b[i]=='\0') // উপরের দুটো কন্ডিশনটি সত্য হয় নি তাই এবার আমরা চেক করছি শুধু দ্বিতীয় স্ট্রিংটি শেষ হয়েছে কিনা
{
printf("B choto\n"); // যদি দ্বিতীয় স্ট্রিংটি শেষ হয়ে থাকে তাহলে এটিই ছোট।
break; // ব্রেক করে লুপ থামিয়ে দেওয়া হচ্ছে।
}
// উপরের তিনটি কন্ডিশনের কোনটিই যদি সত্য না হয়ে থাকে তাহলে বুঝা যাচ্ছে কোন স্ট্রিং ই শেষ হয়ে যায় নি। এবার আমাদের মিল অমিল চেক করতে হবে তাই নতুন একটি ইফ এলস লেডার চালানো হচ্ছে।
if(a[i]==b[i]) // প্রথমেই চেক করে নিচ্ছি দুটো স্ট্রিং এর ক্যারেক্টার সেইম কিনা।
{
i++; // সেইম হলে আমরা লুপ কন্টিনিউ করব। তাই i এর মান বাড়িয়ে দিচ্ছি।
}
else if(a[i]<b[i]) // যদি উপরের কন্ডিশন সত্য না হয় তারমানে অমিল পাওয়া গেছে। এবার দেখছি প্রথম স্ট্রিং এর ক্যারেক্টারটি ছোট কিনা।
{
printf("A choto\n"); // যদি ছোট হয় তাহলে প্রিন্ট করে দিচ্ছি প্রথম স্ট্রিংটি ছোট।
break; // ব্রেক করে লুপ থামিয়ে দেওয়া হচ্ছে।
}
else // যদি উপরের কন্ডিশন সত্য না হয় তারমানে অবশ্যই দ্বিতীয় স্ট্রিং এর ক্যারেক্টারটি ছোট।
{
printf("B choto\n"); // তাই প্রিন্ট করে দিচ্ছি দ্বিতীয়টি ছোট।
break; // ব্রেক করে লুপ থামিয়ে দেওয়া হচ্ছে।
}
}
return 0;
}আমরা নিজেরা এটির লজিক বুঝে ফেললাম এবার আমরা এই পুরো কাজটি করার জন্য একটি বিল্ট-ইন ফাংশন আছে। ওটা দেখে নিব।
ফাংশনটি হলো strcmp()। এই ফাংশনে আমরা দুটি স্ট্রিং দেই। ফাংশনটি আমাদের ৩ ধরনের ভেলু রিটার্ন করে।
- ০ এর থেকে বড়ঃ দ্বিতীয় স্ট্রিংটি ছোট
- ০ : দুটি স্ট্রিং ই সমান।
- ০ এর থেকে ছোটঃ প্রথম স্ট্রিংটি ছোট।
Code (Using strcmp):
#include <stdio.h>
#include <string.h>
int main()
{
char a[100],b[100];
scanf("%s %s",a,b); // দুটি স্ট্রিং ইনপুট নিচ্ছি।
int v=strcmp(a,b); // strcmp ফাংশনের মধ্যে ইনপুট নেওয়া দুটি স্ট্রিং দেওয়া হচ্ছে এবং ফাংশন যেই ভেলুটি রিটার্ন করবে তা আলাদা একটি ভেরিয়েবলে স্টোর করছি।
if(v<0) // চেক করে দেখছি ফাংশনের রিটার্ন করা ভেলুটি ০ এর থেকে ছোট কিনা
{
printf("A is smaller\n"); // যদি ছোট হয় তাহলে প্রথম স্ট্রিংটি ছোট।
}
else if(v>0) // চেক করে দেখছি ফাংশনের রিটার্ন করা ভেলুটি ০ এর থেকে বড় কিনা
{
printf("B is smaller\n"); // যদি বড় হয় তাহলে দ্বিতীয় স্ট্রিংটি ছোট।
}
else // যদি রিটার্ন করা ভেলুটি ০ হয়
{
printf("Same\n"); // তাহলে স্ট্রিং দুটি সেইম।
}
return 0;
}