সি প্রোগ্রামিং ভাষা – স্ট্রিং (string)

সি প্রোগ্রামিং ভাষার স্ট্রিং (String) নিয়ে আলোচনা করা হয়েছে এ নথিতে।

String হচ্ছে এক Char Array। অনেক প্রোগ্রামিং ভাষায় স্ট্রি আলাদা ভাবে ডাটাটাইপ হিসেবে থাকলেও সি ভাষায় অ্যারে দিয়ে স্ট্রিং এর কাজ করা হয়ে থাকে।

String এর কাজ কি?

“I love Bangladesh” এটি হচ্ছে একটি স্ট্রি। অর্থাৎ এক বা একাধিক ক্যারেক্টার মিলেই তৈরি হয় একটি স্ট্রিং। স্ট্রিংকে সিতে  Double Quotation Mark (” “) এর ভিতর লিখা হয়।

“I love Bangladesh” এর character গুলো হলঃ

'I', ' ', 'l', 'o', 'v', 'e', ' ', 'B', 'a', 'n', 'g', 'l', 'a', 'd', 'e', 's', 'h'

ক্যারেক্টারকে সিতে Single Quotation Mark (‘ ‘) এর ভিতর লিখা হয়।

স্ট্রিং Define করে কিভাবে?

স্ট্রিং ডিফাইন করার সাধারণ নিয়ম হচ্ছেঃ

storage_class char string_name[expression];

এখানে storage_class অংশটাকে নথিতে আলোচনা করা হয়নি। কারন storage_class একটি সম্পূর্ণ আলাদা বিষয়। যা সব ভ্যারিয়েবলে একই ভাবে কাজ করে। এ নিয়ে অন্য নথিতে আলোচনা করা হবে।

স্ট্রিং ডিফাইন উদাহরণঃ

char name[80];
char age[8];

স্ট্রিং এ প্রারম্ভ ডেটা দেয়া (initialization)

স্ট্রিং এ ডেটা রাখার একাধিক উপায় আছে। নিচের সরাসরি কিছু উদাহরন দিয়েই দেখা যাক।

ধরি আমরা স্ট্রিং এ রাখব “Hello World!”। তো এটি কিকি ভাবে রাখা যায় তা দেখা যাক।

char foo[50] = "Hello World!";
char bar[50] = {'H', 'e', 'l', 'l', 'o', ' ', 'W ', 'o', 'r', 'l', 'd', '!'};

এছাড়া প্রারম্ভে ডেটা দেয়ার সময় অ্যারের আকার (size) না দিয়েও লিখা যায়। এ সময় কম্পাইলার নিজেই স্ট্রিং অ্যারের আকার হিসাব করে নেয়। উদাহরন-

char foo[] = "Hello World!";
char bar[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W ', 'o', 'r', 'l', 'd', '!'};

নাল (null) ক্যারেক্টার

স্ট্রিং এর ক্ষেত্রে একটি গুরুত্বপূর্ণ জিনিস হল null ক্যারেক্টর (‘\0’)। এটি দিয়ে বুঝা যায় যে স্ট্রিংটি কোথায় শেষ হয়েছে। বিশেষ করে স্টিং এর সঠিক আকার বের করতে এটি খুবই গুরুত্বপূর্ণ। নিচের null char এর কাজ দেখানো হয়েছে।

কোনো একটি স্ট্রিং এ মান রাখা হলে কম্পাইলার নিজেই স্ট্রিং এর শেষে একটি null ক্যারেক্টার দিয়ে দেয়। তাই স্ট্রিং অ্যারের আকার দেয়ার সময় লক্ষ রাখতে হবে যাতে আমরা যত ক্যারেক্টার ইনপুট দিব স্ট্রিং অ্যারের আকার যাতে কমপক্ষে তার থেকে ১ বেশী হয়।

যেমনঃ “Hello World!” এ মোট ক্যারেক্টার আছে ১২টি। তাই এটিকে স্ট্রিং অ্যারেতে রাখতে কমপক্ষে আকার দিতে হবে কমপক্ষে ১৩-

char str[13] = "Hello World!";

যেহেতু অ্যারেতে হিসাব শুরু হয় ০ থেকে, সেহেতু স্ট্রিংটি অ্যারেতে এভাবে সাজবে-

Array Number | Character
          0  | 'H'
          1  | 'e'
          2  | 'l'
          3  | 'l'
          4  | 'o'
          5  | ' '
          6  | 'W'
          7  | 'o'
          8  | 'r'
          9  | 'l'
          10 | 'd'
          11 | '!'
          12 | '\0'  (Null Char)

আমরা যদি না জানি যে কতটা ক্যারেক্টার থাকবে স্ট্রিং এ তাহলে সম্ভাব্য বড় আকারটাই স্ট্রি ডিফাইনের সময় দেয়া হয়। এরকম ক্ষেত্রে স্ট্রিং এ ইনপুট নেয়ার পর ইনপুট গুলোর প্রতিটি ক্যারেক্টার নিয়ে কাজ করার সময় স্ট্রিংয়ের সমাপ্তি বুঝা যায় null ক্যারেক্টার দিয়ে। কারন, স্ট্রিং এর শেষ ক্যারেক্টারের পরে অবশ্যই একটি null ক্যারেক্টার থাকে। উপরের উদাহরণে তা দেখানো হয়েছে। নিচে আরেকটি উদাহরন দেয়া হলঃ

যদি একটি স্ট্রিং এভাবে লিখা হয়ঃ

char str[80] = "IW Code";

তাহলে তা অ্যারেতে সাজবে এভাবেঃ

Array Number | Character
          0  | 'I'
          1  | 'W'
          2  | ' '
          3  | 'C'
          4  | 'o'
          5  | 'd'
          6  | 'e'
          7  | '\n' (Null Char)
          8  | ''
          9  | ''
          10 | ''
           ...
           ...
          78 | ''
          79 | ''

তো দেখা যাচ্ছে স্ট্রিং null ক্যারেক্টার আছে 7 নং এ, তো এ থেকে বলা যায় স্ট্রিংটি 6নং element টিই এর শেষ character এবং এও বলা যায় এর স্ট্রিটির আকার (string length) ৭।

স্ট্রিং পড়া এবং লেখা (String Reading And Writing)

স্ট্রিং scanf() দিয়ে পড়া/ইনপুট নেয়া যায় এবং printf() ফাংশন দিয়ে লেখা/আউটপুট দেয়া যায়।

স্ট্রি ইনপুট/আউটপুটের একটি উদাহরন দেখা যাকঃ

#include<stdio.h>

int main()
{
    char str[80];

    printf("Enter a string: ");
    scanf("%s", str);

    printf("The Entered String is: %s", str);

    return 0;
}

scanf() এবং printf() ফাংশনে %s দিয়ে স্ট্রিং পড়া এবং লেখা হয়। উপরের প্রোগ্রাম চালু করে ইনপুট “Bangladesh” দিলে আউটপুট আসবে নিচের মতঃ

string-printf-scanf

কিন্তু এতে যদি ইনপুট দেয়া হয় “Hello Bangladesh” তাহলে কি আসবে?

string-gets-puts

শুধু “Hello” প্রিন্ট হয়েছে! কারন scanf() ফাংশনের একটি সমস্যা হল এটি কোনো ফাঁকা ক্যারেক্টার (‘ ‘) (Blank space [ASCII – 32]) পেলেই ইনপুট নেয়া বন্ধ করে দেয়।

এধরনের সমস্যা সহজে সমাধানের জন্য gets() (get strings) লাইব্রেরি ফাংশনটি ব্যবহার করা হয়। এটি Blank Space ও পড়তে পারে। এটি শুধু স্ট্রিং এর জন্যই তৈরি করা। এরকম আরেকটি ফাংশন হল puts() (put strings), স্ট্রিং আউটপুট দেয়ার জন্য এটি printf() ফাংশনের বিকল্প। এটিও শুধু স্ট্রিং এর জন্য তৈরি করা। তো ফাংশন দুটির একটি উদাহরন দেখা যাক-

#include<stdio.h>

int main()
{
    char str[80];

    printf("Enter a string: ");
    gets(str);

    printf("The Entered String is: ");
    puts(str);

    return 0;
}

এ প্রোগ্রামে যা ইনপুট দিবেন তাই আউটপুট পাওয়া যাবে। যেমন- এখানে “Hello Bangladesh” ইনপুট দিলে নিচের মত আউটপুট পাওয়া যাবে।

string-gets-puts-preview

বহুমাত্রিক (multi-dimensional) স্ট্রিং অ্যারে

আগের উদাহরন গুলোতে আমরা একটি স্ট্রিং অ্যারেতে একটি স্ট্রিং ডেটা রাখতে পারতাম। এখন প্রশ্ন হল “স্ট্রিং অ্যারের” অ্যারে তৈরি করা কি সম্ভব? মানে কোনো একটা অ্যারেতে কি একাধিক স্ট্রিং ডেটা রাখ সম্ভব?

হ্যাঁ। স্ট্রিং এর ক্ষেত্রেও বহুমাত্রিক অ্যারে থিউরি ব্যবহার করা সম্ভব। তো চলুন একটি উদাহরন দেখে নেয়া যাক।

ধরি আমাদের একটি স্ট্রং অ্যারে লাগবে, যাতে বাংলাদেশের বিভাগ সমূহের নাম থাকবে। তো আমাদের মোট স্ট্রিং সংখ্যা হবে ৭টি এবং প্রতিটি স্ট্রিং এ সর্বোচ্চ ক্যারেক্টার লাগবে ২০ (ধরে নিলাম)। তো একে প্রকাশ কর যাবে নিচের মতন করেঃ

char bd[7][20] =
    {
        "Barisal",
        "Chittagong",
        "Dhaka",
        "Khulna",
        "Rajshahi",
        "Rangpur",
        "Sylhet"
    };

এটি একটি দ্বিমাত্রিক (two dimensional) অ্যারে। এ ধরনের স্ট্রিংকে ব্যবহার করা হয় এভাবেঃ

printf("%s", bd[0]);

----------[RESULT]----------
Barisal
----------------------------

printf("%s", bd[3]);

----------[RESULT]----------
Khulna
----------------------------

স্ট্রিংয়ের ভিতর কোনো ক্যারেক্টার কে ব্যবহার করা যায় এভাবেঃ

printf("%c", bd[1][0]);

----------[RESULT]----------
C
----------------------------

printf("%c", bd[4][2]);

----------[RESULT]----------
j
----------------------------

আর যদি সব গুলো স্ট্রিংকে একই সাথে আউটপুট দিতে চান তাহলে একটা লুপ দিয়েই কাজটি করা যায়ঃ

#include<stdio.h>

int main()
{
    char bd[7][20] = {"Barisal", "Chittagong", "Dhaka", "Khulna", "Rajshahi", "Rangpur", "Sylhet"};

    int i;

    for(i=0; i<7; i++)
        printf("%s\n",bd[i]);

    return 0;
}

এটি চালু করলে নিচের মত আউটপুট পাওয়া যাবেঃ

c-string-two-dimensional

স্ট্রিং এর জন্য আরো কিছু লাইব্রেরি ফাংশন

স্ট্রিং এর জন্য string.h নামে একটি লাইব্রেরি আছে, যাতে স্ট্রিংয়ের জন্য অনেক গুলো ফাংশন দেয়া আছে। string.h লাইব্রেরিতে কি কি ফাংশন আছে তার একটি তালিকা নিচে দেয়া হল। চিত্রটি Turbo C++ 3.0 থেকে নেয়া হয়েছে।

string.h

এগুলোর ভিতর কিছু গুরুত্বপূর্ণ ফাংশনের ব্যবহার নিচে আলোচনা করা হয়েছে।

Strlen()

int strlen(string_name)    [string length]

স্ট্রিং এর ক্যারেক্টার সংখ্যা জানার জন্য এটি ব্যবহার করা হয়। এটি ক্যারেক্টার সংখ্যা integer এ রিটার্ন করে।

strcpy()

strcpy(destination_str, source_str)    [string copy]

একটি স্ট্রিং এ্যারে এর ডেটা আরেকটি স্ট্রিং অ্যারেতে অনুলিপি (copy) করতে এ ফাংশনটি ব্যবহৃত হয়।

strcmp()

int strcmp(str1, str2)    [string compare]

দুটি অ্যারে স্ট্রিং এর মধ্যে তুলনা (compare) করতে এ ফাংশনটি ব্যবহার করা হয়। স্ট্রিং দুটি একই হলে শূণ্য রিটার্ন করে। অন্য ক্ষেত্রে শূণ্য ব্যতিত অন্য যে কোনো সংখ্যা রিটার্ন দিবে।

strcat()

strcat(destination_str, source_str)    [string concatenation]

কোনো স্ট্রিং অ্যারেতে আরেকটি স্ট্রিং অ্যারের ডেটা যুক্ত (append/add) করতে এ ফাংশনটি ব্যবহৃত হয়। source_str এর স্ট্রিংটি destination_str এর স্ট্রিং এর শেষে যুক্ত হবে।

কোনো মন্তব্য থাকলে বলুন