স্ট্রিং (String)

তোমার শিক্ষক মশাই তোমার কাছে আবার সমস্যা নিয়ে এসেছে। সে এখন সবার নাম্বার একবারে Input দিয়ে যোগ করতে পারলেও সে মনে রাখতে পারে যে কোনটা কার নাম্বার। তাই সে এখন চাচ্ছে নাম্বার Input দেওয়ার পাশাপাশি শিক্ষার্থীদের নামও Input টি দিবে যাতে করে প্রত্যেকের Result Output হওয়ার সময় তাদের নামও Output হবে। এখন নাম কি করে Input নেওয়ার যায়? নামতো সংখ্যা বা একটা Character না। অনেক গুলো Character মিলে একটা নাম হয়। এর জন্য আমাদের লাগবে String। একাধিক Character পাশাপাশি বসে একটি String গঠন করে। অন্যান্য Programming Language এ String এর জন্য আলাদা Data Type থাকলেও C Programming Language এ String এর জন্য কোন Data Type নেই। তাই C তে Character Array দিয়ে String বানানো হয়ে থাকে। এক Null Terminated String বলে। ‘’ Character টিকে Null Character বলা হয়। C তে প্রত্যেকটি String কে Null Character দিয়ে শেষ করতে হয় তাই একে Null Terminated String বলা হয়। এবার দেখা যাক একটা String কিভাবে Input নিবো ও Output দিবো।

#include <stdio.h>
int main(){
	char string1[] = “Hello World!”; 	// String Declare করে Initialize করে দেওয়া হয়েছে
char string2[11];			// ১০ Character এর String এর জন্য
char string3[31];			// ৩০ Character এর String এর জন্য
	scanf(“%s”, string2);			// Space Character হিন String Input নেওয়ার জন্য
	getchar();				// ‘\n’ Character Avoid করার জন্য
	gets(string3);				// Space Character যুক্ত String Input নেওয়ার জন্য
	puts(string1);
	printf(“%s %s”, string2, string3);
	return 0;
}

Program টিতে প্রথমে আমরা একটি String Declare করে তা Initialize করে দিয়েছি। Initialize করে দিলে আমাদের String এর Size বলে দেওয়া লাগে না। পরের দু’টি String হল যথাক্রমে ১০ ও ৩০ Character এর String রাখতে পারবে। এখন প্রশ্ন হচ্ছে Declare তো করা হয়েছে ১১ ও ৩১ Size এর তাহলে বাকি ১ কি হবে? আগেই বলছি যে C String হল Null Terminated String অর্থাৎ String এর শেষে একটি Null Character থাকবে। তাই Null Character এর জন্য এক Size বেশি Declare করা হয়েছে। সব সময় এই জিনিসটা মাথায় রাখতে হবে যে আমাদের যতটুকু Size এর String লাগবে তার চাইতে এক Size বেশি Declare করতে হবে। আরেকটা জিনিস String এর Size 11 হওয়ার মানে এই না যে 11 Size এরই String Input দিতে হবে। এর চাইতে কমও Input নেওয়া যাবে তবে বেশি নেওয়া যাবে না। আমাদের Program এ একটা String সর্বোচ্চ যত বড় হতে পারে আমরা সেই Size এর এক Size বেশি String Declare করবো। এখন আমরা দুই ভাবে Input নিতে পারি। দু’টি পদ্ধতিই আমাদের শিখতে হবে।

একটি হল scanf() ব্যবহার করে। এক্ষেত্রে আমাদের %s format specifier ব্যবহার করতে হবে। আরেকটি ব্যপার লক্ষ কর যে scanf এর ভিতর আমরা Variable এর নামের পূর্বে & (Ampersand) দেইনি কারণ এখানে আমরা একটি Variable না বরং পুরো Array তে Input নিচ্ছি এবং যেকোন Array এর নাম তার প্রথম Element বা Variable এর Address Indicate করে। scanf দিয়ে Input নেওয়ার অসুবিধা হল এটি কোন space character input নেয় না। কোন space character পেলেই এর Input নেওয়া শেষ হয়ে যায়। এখন আমরা যদি কারো ডাক নাম Input নিতে চাই তাহলে আমরা scanf ব্যবহার করলেই পারবো। অর্থাৎ আমরা যদি এমন কোন String Input নেই যেখানে কোন Space হবে না সেক্ষেত্রে আমরা scanf ব্যবহার করে Input নিবো।

এখন আমাদের যদি কারো পুরো নাম Input নিতে হয় অর্থাৎ এমন কোন String Input নিতে হয় যেখানে Space Character আছে তাহলে আমরা কি করবো? তাহলে আমরা ব্যবহার করবো gets() function। gets() function ‘\n’ বা New Line Character না পাওয়া পর্যন্ত Input নিতে পারে। অর্থাৎ আমরা যতক্ষণ না পর্যন্ত Enter চাপবো ততক্ষণ পর্যন্ত Input নিতে পারবে। ফলে ‘\n’ এর পূর্বে আমরা যাই Input দেই না কেন সবই Input নিবে।

এখন gets() এর একটা সমস্যা হল আমরা gets() call করা পূর্বে যদি কোন Input নিয়ে থাকি তাহলে Input টি নেওয়ার পর যখন আমরা Enter চাপবো তখন gets() সেই Enter কে Input নিয়ে নিবে। অর্থাৎ gets() function টির কাজ শেষ হয়ে যাবে। তাই আমরা gets() এর মাধ্যমে কিছুই Input নিতে পারবো না। এই সমস্যা এরানোর জন্য আমাদের ব্যবহার করতে হবে getchar() function। getchar() function টি একটি Character Input নিতে পারে। তাই এটি ঐ ‘\n’ Character টিকে Input নিয়ে নিবে। ফলে gets() এর জন্য রাস্তা Clear হয়ে যাবে।

scanf বা gets() যেভাবেই Input নেই না কেন আমাদের ‘’ Input দিতে হবে না। function দু’টি এই কাজটা নিজেই করে নেয়। তবে আমরা নিজেরা যখন String Manupulation করবো তখন আমাদের অবশ্যই ‘’ String এর শেষে নিজে থেকে বসিয়ে দিতে হবে।

Output ও আমরা দুই ভাবে দিতে পারি। scanf এর বিপরীত হিসেবে আমরা printf ব্যবহার করতে পারি। অথাবা gets() এর বিপরীত হিসেবে আমরা puts() ব্যবহার করতে পারি। puts() ব্যবহার এর একটা সুবিধা হল এটি নিজে থেকে একটি new line তৈরি করে দেয়। উপরের Program টি দেখে খুব সহজেই বুঝার কথা যে printf ও puts ব্যবহার করে কিভাবে String Output দেওয়ার যায়।

এখন আমাদের শিক্ষকের সমস্যাটা দূর করা যাক। অনেক গুলো শিক্ষার্থীর নাম রাখার জন্য আমাদের লাগবে String এর Array। C তে String এর Array বলতে 2D Character Array কেই বোঝানো হয়ে থাকে।

#include <stdio.h>
int result[10]; // ১০ জন এর ছয়টি বিষয়ে যোগফল রাখার জন্য একটি Globar Array Declare করা হয়েছে।
int main(){
	int i, j, array[10][6]; // ১০ জন এর ছয়টি করে বিষয় রাখার জন্য 2D Array
	char name[10][16];  // ১০ জন এর নাম থাকবে এবং এক এক জনের নাম সর্বোচ্চ ১৫ Character এর
	for(i = 0; i<10; i++){ // i এর Loop 2D Array এর Row Access করার জন্য
		scanf(“%s”, name[i]);
		for(j = 0; j<6; j++){ // j এর Loop 2D Array এর Column Access করার জন্য
			scanf(“%d”, &array[i][j]);
		}
	}
	for(i = 0; i<10; i++){
		for(j = 0; j<6; j++){
			result[i] += arrya[i][j];
		}
	}
	for(i = 0 ; i<10; i++){
		printf(“%s %d\n”, name[i], result[i]); // নাম সহ ১০ জন এর Result Print করা হল
}
return 0;
}

আগের Program টি বুঝে থাকলে এবং String Input নেওয়া ও Output দেওয়া বুঝে থাকে এই Program টি বুঝতে কোন সমস্যা হওয়ার কথা না।

এখন String দিয়ে আমাদের বিভিন্ন কাজ করতে হতে পারে যেমন দু’টি এক সাথে জোড়া লাগানো, Sub String খোঁজা ইত্যাদি। String নিয়ে কাজ করার জন্য আমাদের কিছু Built-in Function এর সাহায্য লাগবে তাই আমরা কিছু Built-in Function এর কাজ জেনে নেই।

strlen(): String এর Length জানার জন্য আমরা এই Function টি ব্যবহার করবো। এই Function টি একটি Integer Return করে যা হল ঐ String এর Length। তাই আমরা এই Return Value কে একটি int Type এর Variable এ Store করতে পারি।

strcat(): দু’টি String জোড়া লাগানোর জন্য আমাদের strcat Function টি ব্যবহার করতে হবে। একে String Concatination বলে।

strcpy(): একটি String কে অন্য একটি String এ Copy করার জন্য strcpy() Functio টি ব্যবহার করতে হবে।

strcmp(): দু’টি String একই কিনা যাচাই করার জন্য আমাদের প্রয়োজন পরবে strcmp() Fucntion। দু’টি String সমান হলে Function টি 0 (শূণ্য) Return করে।
নিচে একটি Program এর মাধ্যমে Function গুলোর ব্যবহার দেখা যাকঃ

#include <stdio.h>
#include <string.h>
int main(){
	char str1[] = "C Programming";
	char str2[] = " is Fun";
	char str3[50];
	int len = strlen(str1);	// str1 এর Length বের করে len নামের Variable এ রাখা হল
	printf("%s\n", str1);		// str1 Print করা হল
	printf("%s\n", str2);		// str2 Print করা হল
	printf("%d\n", len);		// str1 এর Length Print করা হল
	strcat(str1, str2);		// str1 এর সাথে str2 Concatinate করা হল
	printf("%s\n", str1);		// Concatination এর পর str1 এর নতুন Value Print করা হল
printf("%s\n", str2);		// str2 এর কোন পরিবর্তন হয়নি
	strcpy(str3, str1);		// str1 এর Value str3 তে Copy করা হল
    	if(strcmp(str1, str3)==0){	// যাচাই করা হচ্ছে str1 এবং str3 সমান কিনা
		printf("%s", str3);	// যেহেতু str1 কে str3 এ Copy করা হয়েছে তাই তারা সমান
    	}
	return 0;
}

Input, Output কিংবা Built-in Function ব্যবহার করার সময় আমাদের Null Character নিয়ে ভাবার প্রয়োজন পরে না। কিন্তু আমরা যখন Manually String Manupulate করবো তখন অবশ্যই Null Character টিক সাবধানে Handle করতে হবে না হলে Garbage Value আসবে। অপ্রত্যাশিত কোন Value কে Garbage Value বলে। একটা Program এর মাধ্যমে আমরা বুঝার চেষ্টা করি কিভাবে Null Character কে Manually Hangle করা যায়। আমরা এখন একটি String কে Reverse করবো একটি Function ব্যবহার করে।

#include <stdio.h>
#include <string.h>

void reverse(char str1[], char str2[]){
    int i, j, len = strlen(str2);
    for(i=0, j=len-1; i<len; i++, j--){
        str1[i] = str2[j];
    }
    str1[i] = '\0';
}

int main(){
    char s1[] = "ABAABA";
    char s2[10];
    reverse(s2, s1);
    printf("%s\n%s\n", s1, s2);
	return 0;
}

অনেক সহজ একটি Program। আশা করি বুঝতে অসুবিধা হবে না। এখানে আমরা reverse Function টি ব্যবহার করে একটি String কে Rever করছি। str2 হল আমাদের মূল String যা main Function থেকে পাঠানো হবে এবং তার সাথে একটি Empty String পাঠানো হবে যেটায় আমরা str2 এর Reverse Strore করবো। প্রথমে আমরা str2 এর Length বের করে নিলাম কারণ আমাদের Length এর আগ পর্যন্ত Loop চালাতে হবে। এখানে আমাদের দু’টি Loop Controller লাগবে একটি 0 (শূণ্য) থেকে শুরু হয়ে len-1 পর্যন্ত চলবে অর্থাৎ String এর শুরু থেকে শেষ পর্যন্ত অপটি ঠি তার উল্টা। এটি শেষ থেকে শুরু পর্যন্ত চলবে। ফলে আমরা str2 এর শেষ থেকে এক এক করে Character str1 এর শুরুতে নিয়ে আসতে পারবো। Loop শেষ হয়ে গেলে আমাদের String উল্টা হয়ে যাবে এখন শুরু Null Character বসানোর পালা। i বারতে বারতে যখন len এর সমান হবে তখনই Loop শেষ হয়ে যাবে। অর্থাৎ Sting টির শেষ Location হল len-1 তাই আমাদের Null Character বসবে len তম Location এ। Loop শেষ হওয়ার পর i এবং len এর value সমানই থাকবে তাই যেকোন একটি ব্যবহার করলেই হল। ব্যাস কাজ শেষ আমাদের String টি এখন Reverse হয়ে গেছে। Null Character না দিলে কি হয় যাচাই করতে চাইলে str1[i] = ”; line টি মুছে দাও বা Comment করে দাও এর পর Run করে দেখো।

Advertisements
Tagged with: ,
Posted in বেসিক প্রোগ্রামিং

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: