স্ট্রিং মানে হচ্ছে অনেকগুলো ক্যারেকটার এর সমাবেশ। C টোকেন পড়ার সময় স্ট্রিং কনস্ট্যান্ট সম্পর্কে বলা হয়েছে। একটি ক্যারেকটার কে রাখার জন্য আমরা char টাইপের একটি ভ্যারিয়েবল ব্যবহার করে থাকি। কিন্তু অনেকগুলো ক্যারেকটার একসাথে অর্থাৎ স্ট্রিং কনস্ট্যান্ট রাখার জন্য আমরা কি করবো?
C ভাষায় স্ট্রিং নিয়ে কাজ করার জন্য আলাদা কোন মৌলিক ডেটা টাইপ নেই। তবে উদ্ভূত ডেটা টাইপ array এর ধারনা ব্যবহার করে, C ভাষায় স্ট্রিং নিয়ে কাজ করা হয়।
C ভাষায়, স্ট্রিং হচ্ছে একটি ক্যারেকটার array যার সমাপ্তি নির্দেশ করে একটি Null Terminator। এই নাল টার্মিনেটর হচ্ছে একটি ব্যাক স্ল্যাশ ক্যারেকটার '\0'। এর সংখ্যা মান 0।
উপরের সংগাটি একটু ব্যাখ্যা করি। একটি স্ট্রিং রাখার জন্য আমাদের একটি char টাইপের array নিতে হবে যার প্রত্যেকটি ইন্ডেক্সে ১ টি করে ক্যারেকটার রাখা যাবে। এবং সম্পূর্ণ স্ট্রিং টি রাখা শেষ হলে তার পরের ইন্ডেক্সে একটি নাল টার্মিনেটর ('\0') রাখা হবে। তাহলেই ঐ ক্যারেকটার array টিকে আমরা string বলতে পারবো। মনে রাখতে হবে যে, C ভাষায় সকল স্ট্রিং ই ক্যারেকটার array, কিন্তু সকল ক্যারেকটার array কিন্তু স্ট্রিং না। শুধু মাত্র নাল টার্মিনেট হওয়া, অর্থাৎ সর্বশেষ ব্যবহৃত ইন্ডেক্সে নাল টার্মিনেটর থাকা ক্যারেকটার array হচ্ছে string।
এটা আশা করি এখন স্পষ্ট যে, আমরা যদি একটি সাধারণ ক্যারেকটার array তে ৫ টি ক্যারেকটার রাখতে চাই, তাহলে আমাদের ৫ ইন্ডেক্সের একটি ক্যারেকটার array হলেই চলে। কিন্তু ৫ ক্যারেকটার এর একটি স্ট্রিং রাখার জন্য আমাদের যে ক্যারেকটার array নিতে হবে, তাতে কমপক্ষে ৫+১ (নাল টার্মিনেটর রাখার জন্য)= ৬ টি ইন্ডেক্স থাকতে হবে।
N দৈর্ঘ্যের একটি স্ট্রিং রাখার জন্য N+1 ইন্ডেক্সের একটি ক্যারেকটার array ডিক্লেয়ার করতে হবে।
এইবার আমরা ডিক্লেয়ারেশন এর অংশে আসি।
char str[10];
str ক্যারেকটার array টিতে সর্বোচ্চ ৯ ক্যারেকটার দৈর্ঘ্যের একটি স্ট্রিং রাখা যাবে। স্ট্রিং এর জন্য ক্যারেকটার array ডিক্লেয়ার করার সময় ইন্ডেক্স সংখ্যা ফাকা রেখে এবং তাতে একটি স্ট্রিং কনস্ট্যান্ট এসাইন করে ডিক্লেয়ার করা যায়।
যেমন,
char str[]="I love strings.";
এখানে str array টিতে কম্পাইলার অটোমেটিকালি ১৬ টি ইন্ডেক্স নিয়ে নিয়েছে এবং তাতে স্ট্রিং কনস্ট্যান্টটিকে কপি করে নিয়েছে। সমাপ্তিজ্ঞাপক নাল টার্মনেটরও কম্পাইলারই সরবরাহ করেছে।
ডিক্লেয়ার করার সময় ইন্ডেক্স সংখ্যা ফাকা রেখে এসাইন করা ছাড়া, অন্য কোন অবস্থাতেই ক্যারেকটার array তে কোন স্ট্রিং কনস্ট্যান্ট এসাইন করা যায় না।
যেমন,
char str[16];
str= "I love strings."; /* এটি অবৈধ */
স্ট্রিং এর নাম হবে স্ট্রিং যে ক্যারেকটার array তে রাখা হচ্ছে তার নাম, তবে ইন্ডেক্স ছাড়া। যেমন, str[16] array তে যদি একটি স্ট্রিং রাখা হয় তাহলে স্ট্রিংকে str নামে ডাকা হবে।
[Note: ইন্ডেক্স ছাড়া যখন কোন array এর নাম লিখা হয়, তখন সেই নামটি ঐ array এর প্রথম ইন্ডেক্সের পয়েন্টার হিসেবে কাজ করে। যারা এখনো পয়েন্টার সম্পর্কে ধারণা নিতে পারেন নাই, তারা এই অংশটি বাদ দিয়ে যান।
কাজেই str নামে যখন কোন স্ট্রিং কে ডাকা হবে তখন তা আসলে ঐ স্ট্রিং এর সূচনার মেমরি এড্রেস হিসেবে কাজ করে। str নামে ডাকার অর্থ হচ্ছে, str হল সেই স্ট্রিং যেটি str[16] ক্যারেক্টার array এর প্রথম ইন্ডেক্স (str[0]) এর মেমরি এড্রেসে যে স্ট্রিংটি শুরু হয়েছে।
অর্থাৎ, স্ট্রিং এর নাম হচ্ছে একটি মেমরি এড্রেস জমা রাখা ভ্যারিয়েবল বা পয়েন্টার। তাই স্ট্রিং ইনপুট নেবার সময় যদি scanf() ব্যবহার করা হয়, তাহলে &variable_name (আলোচ্য ক্ষেত্রে &str) এর পরিবর্তে শুধু str লিখা হয়। কেননা, &variable_name, variable_name ভ্যারিয়েবলটির এড্রেস নির্দেশ করে। আর যেহেতু str সরাসরিই একটি মেমরি এড্রেস, তাই এর আগে '&' ব্যবহার করা অর্থহীন ও ভুল। ]
স্ট্রিং যেহেতু একটি ক্যারেকটার array তে সংরক্ষিত থাকে, সেহেতু array এর মত স্ট্রিংকে ইন্ডেক্সিং করা যায়। যেমন,
char str[]= "I love strings.";
উপরের str একটি স্ট্রিং। আমরা ইচ্ছে করলে যে কোন ইন্ডেক্সে রক্ষিত ক্যারেকটার টি ইন্ডেক্স নাম্বার দিয়ে এক্সেস করতে পারবো। যদি আমরা লিখি,
printf("%c", str[3]);
তাহলে ৩ নম্বর ইন্ডেক্সে রক্ষিত ক্যারেকটার 'o' প্রিন্ট হবে।
নাল টার্মিনেটরটিকেও ইন্ডেক্সিং এর মাধ্যমে এক্সেস করা যায়। একে ক্যারেকটার হিসেবে প্রিন্ট করলে কিছুই প্রিন্ট হবে না (কারন এটি NULL), তবে ইন্টিজার হিসেবে প্রিন্ট করলে '0' (শূন্য) প্রিন্ট হবে, কারণ এর সংখ্যা মান শূন্য।
আশা করি এই আলোচনার পরে আমরা অন্ততপক্ষে স্ট্রিং সম্পর্কে সাধারণ একটি ধারনা পেয়ে গেছি এবং স্ট্রিং এর জন্য ভ্যারিয়েবল ( ক্যারেকটার array) এখন ডিক্লেয়ার করতে পারবো।
নিচের উদাহরণ টি লক্ষ্য করার জন্য অনুরোধ করবো। উপরের আলোচনা যারা পড়েছেন তারা আশাকরি এটা বুঝবেন।
#include<stdio.h>
int main()
{
char str[]="I love strings."; /* স্ট্রিং ডিক্লেয়ার ও ইনিশিয়ালাইজ করা হল */
int i;
/* এইবার একটা একটা করে ক্যারেকটার এক্সেস করা হবে এবং আউটপুট দেওয়া হবে */
for (i =0; str[i]; i++)
{
putchar(str[i]);
}
return 0;
}
এই কোডটি রান করা হলে আউটপুট হবে
I love strings.
লক্ষ্য করেন যে for লুপের কন্ট্রোল কন্ডিশনে str[i] দেওয়া হয়েছে। কখন ও কেন এই লুপ থামবে তা কি কেউ ব্যাখ্যা করে বলতে পারবেন?
C ভাষায় স্ট্রিং নিয়ে কাজ করার জন্য আলাদা কোন মৌলিক ডেটা টাইপ নেই। তবে উদ্ভূত ডেটা টাইপ array এর ধারনা ব্যবহার করে, C ভাষায় স্ট্রিং নিয়ে কাজ করা হয়।
C ভাষায়, স্ট্রিং হচ্ছে একটি ক্যারেকটার array যার সমাপ্তি নির্দেশ করে একটি Null Terminator। এই নাল টার্মিনেটর হচ্ছে একটি ব্যাক স্ল্যাশ ক্যারেকটার '\0'। এর সংখ্যা মান 0।
উপরের সংগাটি একটু ব্যাখ্যা করি। একটি স্ট্রিং রাখার জন্য আমাদের একটি char টাইপের array নিতে হবে যার প্রত্যেকটি ইন্ডেক্সে ১ টি করে ক্যারেকটার রাখা যাবে। এবং সম্পূর্ণ স্ট্রিং টি রাখা শেষ হলে তার পরের ইন্ডেক্সে একটি নাল টার্মিনেটর ('\0') রাখা হবে। তাহলেই ঐ ক্যারেকটার array টিকে আমরা string বলতে পারবো। মনে রাখতে হবে যে, C ভাষায় সকল স্ট্রিং ই ক্যারেকটার array, কিন্তু সকল ক্যারেকটার array কিন্তু স্ট্রিং না। শুধু মাত্র নাল টার্মিনেট হওয়া, অর্থাৎ সর্বশেষ ব্যবহৃত ইন্ডেক্সে নাল টার্মিনেটর থাকা ক্যারেকটার array হচ্ছে string।
এটা আশা করি এখন স্পষ্ট যে, আমরা যদি একটি সাধারণ ক্যারেকটার array তে ৫ টি ক্যারেকটার রাখতে চাই, তাহলে আমাদের ৫ ইন্ডেক্সের একটি ক্যারেকটার array হলেই চলে। কিন্তু ৫ ক্যারেকটার এর একটি স্ট্রিং রাখার জন্য আমাদের যে ক্যারেকটার array নিতে হবে, তাতে কমপক্ষে ৫+১ (নাল টার্মিনেটর রাখার জন্য)= ৬ টি ইন্ডেক্স থাকতে হবে।
N দৈর্ঘ্যের একটি স্ট্রিং রাখার জন্য N+1 ইন্ডেক্সের একটি ক্যারেকটার array ডিক্লেয়ার করতে হবে।
এইবার আমরা ডিক্লেয়ারেশন এর অংশে আসি।
char str[10];
str ক্যারেকটার array টিতে সর্বোচ্চ ৯ ক্যারেকটার দৈর্ঘ্যের একটি স্ট্রিং রাখা যাবে। স্ট্রিং এর জন্য ক্যারেকটার array ডিক্লেয়ার করার সময় ইন্ডেক্স সংখ্যা ফাকা রেখে এবং তাতে একটি স্ট্রিং কনস্ট্যান্ট এসাইন করে ডিক্লেয়ার করা যায়।
যেমন,
char str[]="I love strings.";
এখানে str array টিতে কম্পাইলার অটোমেটিকালি ১৬ টি ইন্ডেক্স নিয়ে নিয়েছে এবং তাতে স্ট্রিং কনস্ট্যান্টটিকে কপি করে নিয়েছে। সমাপ্তিজ্ঞাপক নাল টার্মনেটরও কম্পাইলারই সরবরাহ করেছে।
ডিক্লেয়ার করার সময় ইন্ডেক্স সংখ্যা ফাকা রেখে এসাইন করা ছাড়া, অন্য কোন অবস্থাতেই ক্যারেকটার array তে কোন স্ট্রিং কনস্ট্যান্ট এসাইন করা যায় না।
যেমন,
char str[16];
str= "I love strings."; /* এটি অবৈধ */
স্ট্রিং এর নাম হবে স্ট্রিং যে ক্যারেকটার array তে রাখা হচ্ছে তার নাম, তবে ইন্ডেক্স ছাড়া। যেমন, str[16] array তে যদি একটি স্ট্রিং রাখা হয় তাহলে স্ট্রিংকে str নামে ডাকা হবে।
[Note: ইন্ডেক্স ছাড়া যখন কোন array এর নাম লিখা হয়, তখন সেই নামটি ঐ array এর প্রথম ইন্ডেক্সের পয়েন্টার হিসেবে কাজ করে। যারা এখনো পয়েন্টার সম্পর্কে ধারণা নিতে পারেন নাই, তারা এই অংশটি বাদ দিয়ে যান।
কাজেই str নামে যখন কোন স্ট্রিং কে ডাকা হবে তখন তা আসলে ঐ স্ট্রিং এর সূচনার মেমরি এড্রেস হিসেবে কাজ করে। str নামে ডাকার অর্থ হচ্ছে, str হল সেই স্ট্রিং যেটি str[16] ক্যারেক্টার array এর প্রথম ইন্ডেক্স (str[0]) এর মেমরি এড্রেসে যে স্ট্রিংটি শুরু হয়েছে।
অর্থাৎ, স্ট্রিং এর নাম হচ্ছে একটি মেমরি এড্রেস জমা রাখা ভ্যারিয়েবল বা পয়েন্টার। তাই স্ট্রিং ইনপুট নেবার সময় যদি scanf() ব্যবহার করা হয়, তাহলে &variable_name (আলোচ্য ক্ষেত্রে &str) এর পরিবর্তে শুধু str লিখা হয়। কেননা, &variable_name, variable_name ভ্যারিয়েবলটির এড্রেস নির্দেশ করে। আর যেহেতু str সরাসরিই একটি মেমরি এড্রেস, তাই এর আগে '&' ব্যবহার করা অর্থহীন ও ভুল। ]
স্ট্রিং যেহেতু একটি ক্যারেকটার array তে সংরক্ষিত থাকে, সেহেতু array এর মত স্ট্রিংকে ইন্ডেক্সিং করা যায়। যেমন,
char str[]= "I love strings.";
উপরের str একটি স্ট্রিং। আমরা ইচ্ছে করলে যে কোন ইন্ডেক্সে রক্ষিত ক্যারেকটার টি ইন্ডেক্স নাম্বার দিয়ে এক্সেস করতে পারবো। যদি আমরা লিখি,
printf("%c", str[3]);
তাহলে ৩ নম্বর ইন্ডেক্সে রক্ষিত ক্যারেকটার 'o' প্রিন্ট হবে।
নাল টার্মিনেটরটিকেও ইন্ডেক্সিং এর মাধ্যমে এক্সেস করা যায়। একে ক্যারেকটার হিসেবে প্রিন্ট করলে কিছুই প্রিন্ট হবে না (কারন এটি NULL), তবে ইন্টিজার হিসেবে প্রিন্ট করলে '0' (শূন্য) প্রিন্ট হবে, কারণ এর সংখ্যা মান শূন্য।
আশা করি এই আলোচনার পরে আমরা অন্ততপক্ষে স্ট্রিং সম্পর্কে সাধারণ একটি ধারনা পেয়ে গেছি এবং স্ট্রিং এর জন্য ভ্যারিয়েবল ( ক্যারেকটার array) এখন ডিক্লেয়ার করতে পারবো।
নিচের উদাহরণ টি লক্ষ্য করার জন্য অনুরোধ করবো। উপরের আলোচনা যারা পড়েছেন তারা আশাকরি এটা বুঝবেন।
#include<stdio.h>
int main()
{
char str[]="I love strings."; /* স্ট্রিং ডিক্লেয়ার ও ইনিশিয়ালাইজ করা হল */
int i;
/* এইবার একটা একটা করে ক্যারেকটার এক্সেস করা হবে এবং আউটপুট দেওয়া হবে */
for (i =0; str[i]; i++)
{
putchar(str[i]);
}
return 0;
}
এই কোডটি রান করা হলে আউটপুট হবে
I love strings.
লক্ষ্য করেন যে for লুপের কন্ট্রোল কন্ডিশনে str[i] দেওয়া হয়েছে। কখন ও কেন এই লুপ থামবে তা কি কেউ ব্যাখ্যা করে বলতে পারবেন?
0 comments:
Post a Comment