সি (C) প্রোগ্রামিং শেখার সময় যেসব বিষয় ভালোভাবে বোঝা জরুরি, তার মধ্যে String (স্ট্রিং) অন্যতম। ব্যবহারকারীর নাম, ঠিকানা, ই-মেইল, পাসওয়ার্ড, ফাইলের নাম কিংবা যেকোনো লেখা সংরক্ষণের জন্য স্ট্রিং ব্যবহার করা হয়। মজার বিষয় হলো, C ভাষায় String নামে আলাদা কোনো Built-in Data Type নেই।
বরং একটি String মূলত Character Array, যার শেষে একটি বিশেষ অক্ষর Null Character ('\0') থাকে। এই Null Character কম্পিউটারকে জানিয়ে দেয় যে এখানেই স্ট্রিংটি শেষ হয়েছে। তাই C Programming-এ String ভালোভাবে বুঝতে হলে Character Array এবং Null Character সম্পর্কে পরিষ্কার ধারণা থাকা খুবই গুরুত্বপূর্ণ।
পোস্ট সূচিপত্র
স্ট্রিং (String) কী?
মেমোরিতে স্ট্রিং কীভাবে সংরক্ষিত হয়?
Null Character ('\0') কেন গুরুত্বপূর্ণ?
স্ট্রিং ঘোষণা (Declaration)
স্ট্রিং ইনিশিয়ালাইজেশন (Initialization)
স্ট্রিং ইনপুট নেওয়া
পুরো লাইন ইনপুট নেওয়ার জন্য fgets()
স্ট্রিং প্রিন্ট করা
Character Array ও String-এর পার্থক্য
নতুনদের সাধারণ ভুল
string.h হেডার ফাইল কী?
String Function ব্যবহারের সময় যেসব বিষয় মনে রাখবেন
বাস্তব জীবনে String Function-এর ব্যবহার
Pointer এবং String-এর সম্পর্ক
Pointer দিয়ে প্রতিটি অক্ষর প্রদর্শন
String Literal ও Pointer
Array of Strings
Pointer Array ব্যবহার করে String
Dynamic Memory Allocation দিয়ে String
String Reverse Program
Palindrome Program
String Copy Program (নিজস্ব Function)
String Length Program
দুটি String যুক্ত করা
Character Frequency Program
Vowel Count Program
Interview-এ যেসব প্রশ্ন বেশি আসে
Practice Problems
Best Practices
উপসংহার
FAQ
স্ট্রিং (String) কী?
সহজ ভাষায়, একাধিক অক্ষর (Character) ধারাবাহিকভাবে সাজিয়ে যে টেক্সট তৈরি হয়, তাকে String বলা হয়। যেমনঃ
- Bangladesh
- Programming
- Computer
- OpenAI
- Hello World
সি ভাষায় এই প্রতিটি লেখাই একটি String হিসেবে সংরক্ষণ করা যায়।
উদাহরণঃ
char country[] = "Bangladesh";এখানে country একটি Character Array, যার মধ্যে "Bangladesh" সংরক্ষিত হয়েছে এবং শেষে স্বয়ংক্রিয়ভাবে '\0' যোগ হয়েছে।
মেমোরিতে স্ট্রিং কীভাবে সংরক্ষিত হয়?
অনেকেই মনে করেন String একটি সম্পূর্ণ শব্দ হিসেবে মেমোরিতে থাকে। বাস্তবে তা নয়।
ধরুন,
char text[] = "Hello";মেমোরিতে এটি এভাবে সংরক্ষিত হয়ঃ
| Index | Value |
|---|---|
| 0 | H |
| 1 | e |
| 2 | l |
| 3 | l |
| 4 | o |
| 5 | \0 |
অর্থাৎ প্রতিটি অক্ষর আলাদা মেমোরি লোকেশনে থাকে এবং সর্বশেষে থাকে Null Character।
Null Character ('\0') কেন গুরুত্বপূর্ণ?
- Null Character হলো স্ট্রিংয়ের সমাপ্তি চিহ্ন।
- যখন
printf()বাstrlen()এর মতো Function কোনো String পড়ে, তখন তারা একের পর এক অক্ষর পড়তে থাকে এবং'\0'পেলেই বুঝতে পারে যে স্ট্রিং শেষ। - যদি Null Character না থাকে, তাহলে প্রোগ্রাম ভুল ফলাফল দিতে পারে বা অপ্রত্যাশিত আচরণ করতে পারে।
স্ট্রিং ঘোষণা (Declaration)
সি ভাষায় স্ট্রিং ঘোষণা করার সবচেয়ে সাধারণ নিয়ম হলো Character Array তৈরি করা।
উদাহরণঃ
char name[20];এখানে সর্বোচ্চ ১৯টি অক্ষর এবং শেষে একটি Null Character রাখা যাবে।
আরেকটি উদাহরণ:
char city[30];স্ট্রিং ইনিশিয়ালাইজেশন (Initialization)
স্ট্রিং তৈরি করার সময় সরাসরি মান দেওয়া যায়।
char country[] = "Bangladesh";এক্ষেত্রে Compiler নিজেই প্রয়োজনীয় Array Size নির্ধারণ করে।
আবার চাইলে নির্দিষ্ট Size দিয়েও লেখা যায়।
char country[20] = "Bangladesh";স্ট্রিং ইনপুট নেওয়া
একটি শব্দ ইনপুট নিতে চাইলেঃ
scanf("%s", name);কিন্তু এখানে একটি সীমাবদ্ধতা আছে।
যদি ইনপুট হয়:
Md Rahimতাহলে Output হবে:
Mdকারণ %s প্রথম Space পর্যন্ত পড়ে।
পুরো লাইন ইনপুট নেওয়ার জন্য fgets()
যদি পুরো বাক্য ইনপুট নিতে চান, তাহলে fgets() ব্যবহার করাই নিরাপদ।
fgets(name, sizeof(name), stdin);এটি Space-সহ সম্পূর্ণ লাইন পড়তে পারে এবং Buffer Overflow-এর ঝুঁকিও কমায়।
স্ট্রিং প্রিন্ট করা
স্ট্রিং প্রদর্শনের জন্য %s Format Specifier ব্যবহার করা হয়।
printf("%s", country);Output:
BangladeshCharacter Array ও String-এর পার্থক্য
- অনেক নতুন প্রোগ্রামার এই দুটি বিষয় গুলিয়ে ফেলেন।
- Character Array সব সময় String নয়।
- কোনো Character Array-এর শেষে যদি
'\0'না থাকে, তাহলে সেটিকে String বলা যাবে না। - অন্যদিকে, প্রতিটি String অবশ্যই একটি Character Array।
নতুনদের সাধারণ ভুল
১. Null Character ভুলে যাওয়া
char name[5] = {'H','e','l','l','o'};এটি সঠিক String নয়।
সঠিক হবে:
char name[6] = {'H','e','l','l','o','\0'};২. ছোট Array ব্যবহার করা
char name[5] = "Hello";এখানে Null Character-এর জন্য অতিরিক্ত জায়গা নেই।
সঠিক:
char name[6] = "Hello";৩. gets() ব্যবহার করা
বর্তমান সময়ে gets() ব্যবহার না করাই ভালো, কারণ এটি Buffer Overflow-এর ঝুঁকি তৈরি করে।
এর পরিবর্তে fgets() ব্যবহার করা নিরাপদ।
C Programming-এ স্ট্রিং নিয়ে কাজ করার সময় বারবার একই ধরনের কাজ করতে হয়, যেমন স্ট্রিংয়ের দৈর্ঘ্য বের করা, একটি স্ট্রিং অন্যটিতে কপি করা, দুটি স্ট্রিং যুক্ত করা বা দুটি স্ট্রিং তুলনা করা। এসব কাজ সহজ করার জন্য string.h হেডার ফাইলে অনেক Built-in Function রয়েছে।
string.h হেডার ফাইল কী?
স্ট্রিং-সম্পর্কিত অধিকাংশ ফাংশন ব্যবহার করার আগে string.h হেডার ফাইল যুক্ত করতে হয়।
#include <string.h>এটি যুক্ত না করলে অনেক String Function কাজ করবে না বা Compiler Warning দেখাতে পারে।
১. strlen() – স্ট্রিংয়ের দৈর্ঘ্য নির্ণয়
strlen() ফাংশন একটি স্ট্রিংয়ে মোট কতটি অক্ষর আছে তা গণনা করে। এটি Null Character ('\0') গণনা করে না।
Syntax
strlen(string_name);উদাহরণ
#include <stdio.h>#include <string.h>int main(){char text[] = "Bangladesh";printf("Length = %lu", strlen(text));return 0;}
Output:
Length = 10২. strcpy() – একটি স্ট্রিং কপি করা
একটি স্ট্রিং অন্য একটি স্ট্রিংয়ে কপি করার জন্য strcpy() ব্যবহার করা হয়।
Syntax
strcpy(destination, source);উদাহরণ
#include <stdio.h>#include <string.h>int main(){char source[] = "OpenAI";char destination[20];strcpy(destination, source);printf("%s", destination);return 0;}
Output:
OpenAI৩. strncpy() – নির্দিষ্ট সংখ্যক অক্ষর কপি করা
যদি পুরো স্ট্রিং নয়, বরং নির্দিষ্ট সংখ্যক অক্ষর কপি করতে চান, তাহলে strncpy() ব্যবহার করা হয়।
strncpy(destination, source, 5);এটি Source থেকে প্রথম ৫টি অক্ষর কপি করবে।
৪. strcat() – দুটি স্ট্রিং যুক্ত করা
দুটি স্ট্রিং একসঙ্গে যোগ করতে strcat() ব্যবহার করা হয়।
উদাহরণ
#include <stdio.h>#include <string.h>int main(){char first[30] = "Hello ";char second[] = "World";strcat(first, second);printf("%s", first);return 0;}
Output:
Hello World৫. strncat() – নির্দিষ্ট সংখ্যক অক্ষর যুক্ত করা
যদি দ্বিতীয় স্ট্রিংয়ের নির্দিষ্ট সংখ্যক অক্ষর যোগ করতে চান, তাহলে strncat() ব্যবহার করুন।
strncat(first, second, 3);যদি second = "World" হয়, তাহলে যোগ হবে শুধু "Wor"।
৬. strcmp() – দুটি স্ট্রিং তুলনা করা
strcmp() দুটি স্ট্রিং একই কি না তা যাচাই করে।
উদাহরণ
#include <stdio.h>#include <string.h>int main(){char a[] = "Apple";char b[] = "Apple";if(strcmp(a,b)==0){printf("দুটি স্ট্রিং একই");}else{printf("দুটি স্ট্রিং ভিন্ন");}return 0;}
Output:
দুটি স্ট্রিং একইstrcmp() কী রিটার্ন করে?
| ফলাফল | অর্থ |
|---|---|
| 0 | দুটি স্ট্রিং একই |
| ঋণাত্মক মান | প্রথম স্ট্রিং ছোট |
| ধনাত্মক মান | প্রথম স্ট্রিং বড় |
৭. strncmp() – নির্দিষ্ট সংখ্যক অক্ষর তুলনা
শুধুমাত্র প্রথম কয়েকটি অক্ষর তুলনা করতে চাইলে strncmp() ব্যবহার করা হয়।
strncmp(str1, str2, 4);এটি প্রথম ৪টি অক্ষর তুলনা করবে।
৮. strchr() – একটি অক্ষর খুঁজে বের করা
কোনো স্ট্রিংয়ের মধ্যে নির্দিষ্ট একটি অক্ষর কোথায় আছে তা খুঁজে বের করতে strchr() ব্যবহার করা হয়।
char text[] = "Programming";printf("%s", strchr(text,'g'));
Output:
gramming৯. strrchr() – শেষবার কোথায় অক্ষরটি এসেছে
যদি একটি অক্ষর একাধিকবার থাকে, তাহলে শেষবার কোথায় এসেছে তা বের করতে strrchr() ব্যবহার করা হয়।
১০. strstr() – একটি শব্দ খুঁজে বের করা
একটি বড় স্ট্রিংয়ের মধ্যে আরেকটি ছোট স্ট্রিং খুঁজতে strstr() ব্যবহার করা হয়।
char text[]="I love C Programming";printf("%s", strstr(text,"Programming"));
Output:
Programming
String Function ব্যবহারের সময় যেসব বিষয় মনে রাখবেন
- সবসময় Destination Array যথেষ্ট বড় রাখুন।
- Buffer Overflow এড়িয়ে চলুন।
strcpy()ব্যবহারের আগে Array Size নিশ্চিত করুন।- প্রয়োজনে
strncpy()ব্যবহার করুন। strcmp()Case Sensitive, অর্থাৎAএবংaএক নয়।
বাস্তব জীবনে String Function-এর ব্যবহার
String Function ব্যবহার করে আপনি সহজেই তৈরি করতে পারবেনঃ
- Login System
- Password Validation
- Student Information System
- Library Management System
- Contact Management Software
- File Name Processing
- Search Feature
- Text Editor
Pointer এবং String-এর সম্পর্ক
C Programming-এ String এবং Pointer-এর মধ্যে খুবই ঘনিষ্ঠ সম্পর্ক রয়েছে। কারণ একটি String মূলত Character Array এবং Array-এর প্রথম উপাদানের ঠিকানাই Pointer হিসেবে ব্যবহার করা যায়।
উদাহরণঃ
char name[] = "Bangladesh";char *ptr = name;printf("%s", ptr);
Output
Bangladeshএখানে ptr স্ট্রিংটির প্রথম অক্ষরের ঠিকানা ধারণ করছে।
Pointer দিয়ে প্রতিটি অক্ষর প্রদর্শন
#include <stdio.h>int main(){char name[] = "Programming";char *ptr = name;while(*ptr != '\0'){printf("%c ", *ptr);ptr++;}return 0;}
Output
P r o g r a m m i n gString Literal ও Pointer
নিচের কোডটি লক্ষ্য করুন।
char *name = "OpenAI";এখানে Pointer সরাসরি String Literal-এর দিকে নির্দেশ করছে।
কিন্তু
name[0] = 'A';এভাবে পরিবর্তন করার চেষ্টা করলে অনেক ক্ষেত্রে Undefined Behavior হতে পারে।
অন্যদিকে,
char name[] = "OpenAI";এক্ষেত্রে Array-এর ভেতরের অক্ষর পরিবর্তন করা যায়।
Array of Strings
একাধিক String সংরক্ষণ করতে চাইলে Array of Strings ব্যবহার করা হয়।
উদাহরণঃ
char country[5][20]={"Bangladesh","India","Japan","Canada","Brazil"};
প্রিন্ট করা
for(int i=0;i<5;i++){printf("%s\n",country[i]);}
Output
BangladeshIndiaJapanCanadaBrazil
Pointer Array ব্যবহার করে String
char *country[]={"Bangladesh","India","Japan"};
এক্ষেত্রে প্রতিটি Pointer একটি String-এর ঠিকানা সংরক্ষণ করে।
Dynamic Memory Allocation দিয়ে String
অনেক সময় আগে থেকে String-এর Size জানা থাকে না।
তখন malloc() ব্যবহার করা হয়।
#include <stdio.h>#include <stdlib.h>int main(){char *text;text=(char*)malloc(100*sizeof(char));fgets(text,100,stdin);printf("%s",text);free(text);return 0;}
String Reverse Program
একটি String উল্টো করে দেখানোর Program
#include <stdio.h>#include <string.h>int main(){char text[]="Programming";int len=strlen(text);for(int i=len-1;i>=0;i--){printf("%c",text[i]);}return 0;}
Output
gnimmargorPPalindrome Program
Palindrome হলো এমন String যেটি সামনে ও পিছন থেকে একই রকম পড়া যায়।
উদাহরণঃ
- MADAM
- LEVEL
- RADAR
Program
#include <stdio.h>#include <string.h>int main(){char text[100];scanf("%s",text);int len=strlen(text);int flag=1;for(int i=0;i<len/2;i++){if(text[i]!=text[len-1-i]){flag=0;break;}}if(flag)printf("Palindrome");elseprintf("Not Palindrome");return 0;}
String Copy Program (নিজস্ব Function)
void copy(char a[],char b[]){int i=0;while(a[i]!='\0'){b[i]=a[i];i++;}b[i]='\0';}
String Length Program
int length(char text[]){int count=0;while(text[count]!='\0'){count++;}return count;}
দুটি String যুক্ত করা
void concatenate(char a[],char b[]){int i=0;int j=0;while(a[i]!='\0')i++;while(b[j]!='\0'){a[i]=b[j];i++;j++;}a[i]='\0';}
Character Frequency Program
একটি String-এ কতবার একটি অক্ষর এসেছে তা বের করা।
int count=0;for(int i=0;text[i]!='\0';i++){if(text[i]=='a')count++;}
Vowel Count Program
int vowel=0;for(int i=0;text[i]!='\0';i++){if(text[i]=='a'||text[i]=='e'||text[i]=='i'||text[i]=='o'||text[i]=='u')vowel++;}
Interview-এ যেসব প্রশ্ন বেশি আসে
- String এবং Character Array-এর পার্থক্য কী?
- Null Character কী?
strlen()কীভাবে কাজ করে?strcmp()কী Return করে?scanf()ওfgets()-এর পার্থক্য কী?- Pointer দিয়ে String কীভাবে পড়া যায়?
strcpy()এবংmemcpy()-এর পার্থক্য কী?- Buffer Overflow কী?
Practice Problems
নিজে চেষ্টা করুন।
Problem 1
একটি String-এর মোট Character গণনা করুন।
Problem 2
একটি String Reverse করুন।
Problem 3
Palindrome পরীক্ষা করুন।
Problem 4
দুটি String Alphabetical Order-এ সাজান।
Problem 5
একটি বাক্যে কতটি শব্দ আছে তা বের করুন।
Problem 6
একটি String-এ কতটি Vowel এবং কতটি Consonant আছে তা বের করুন।
Problem 7
একটি String-এর সব ছোট হাতের অক্ষর বড় হাতের অক্ষরে রূপান্তর করুন।
Best Practices
- সবসময়
fgets()ব্যবহার করুন। gets()ব্যবহার করবেন না।- Buffer Overflow এড়িয়ে চলুন।
- Dynamic Memory ব্যবহার করলে
free()করতে ভুলবেন না। - Array Size আগে থেকেই পরিকল্পনা করুন।
- Standard Library Function ব্যবহার করুন।
উপসংহার
সি (C) প্রোগ্রামিং শেখার ক্ষেত্রে String একটি অত্যন্ত গুরুত্বপূর্ণ বিষয়। ব্যবহারকারীর নাম, ঠিকানা, পাসওয়ার্ড, ফাইলের নাম, বার্তা কিংবা যেকোনো টেক্সটভিত্তিক তথ্য নিয়ে কাজ করতে হলে String সম্পর্কে পরিষ্কার ধারণা থাকা আবশ্যক। এই গাইডে আমরা দেখেছি যে C ভাষায় String কোনো আলাদা Data Type নয়; এটি মূলত Null Character ('\0') দিয়ে শেষ হওয়া একটি Character Array। তাই String নিয়ে কাজ করার সময় Character Array, Memory Layout এবং Pointer সম্পর্কে ধারণা থাকা খুবই গুরুত্বপূর্ণ।
এছাড়া string.h লাইব্রেরির strlen(), strcpy(), strcat(), strcmp()-এর মতো ফাংশনগুলো স্ট্রিং পরিচালনার কাজকে অনেক সহজ করে তোলে। তবে এসব ফাংশন ব্যবহারের সময় Array Size, Buffer Overflow এবং Null Character-এর বিষয়গুলো অবশ্যই মাথায় রাখতে হবে। আপনি যদি নিয়মিত কোড অনুশীলন করেন, বিভিন্ন String Problem সমাধান করেন এবং Pointer ও Dynamic Memory Allocation সম্পর্কে দক্ষতা অর্জন করেন, তাহলে C Programming-এ String নিয়ে যেকোনো সমস্যার সমাধান করতে পারবেন।
FAQ
১. C Programming-এ String কী?
String হলো একাধিক Character-এর সমষ্টি, যা একটি Character Array-তে সংরক্ষিত হয় এবং শেষে একটি Null Character ('\0') থাকে।
২. strlen() কী কাজ করে?
strlen() একটি String-এর মোট Character সংখ্যা গণনা করে। এটি Null Character গণনা করে না।
৩. strcpy() এবং strncpy()-এর মধ্যে পার্থক্য কী?
strcpy() পুরো String কপি করে, আর strncpy() নির্দিষ্ট সংখ্যক Character কপি করে।
৪. scanf("%s") এবং fgets()-এর মধ্যে পার্থক্য কী?
scanf("%s") প্রথম স্পেস পর্যন্ত ইনপুট পড়ে, কিন্তু fgets() স্পেসসহ পুরো লাইন পড়তে পারে।
৫. Null Character ('\0') কেন গুরুত্বপূর্ণ?
Null Character একটি String-এর সমাপ্তি নির্দেশ করে। এটি না থাকলে String Function সঠিকভাবে কাজ নাও করতে পারে।
৬. কেন gets() ব্যবহার করা উচিত নয়?
gets() Buffer Overflow-এর ঝুঁকি তৈরি করে এবং এটি C Standard Library থেকে অপসারণ করা হয়েছে। এর পরিবর্তে fgets() ব্যবহার করা উচিত।