মডিউল ১০ঃ ইন্ট্রোডাকশন টু স্ট্রিং
মডিউল ১০-০: সূচনা
এই মডিউলে আরো একটা নতুন এবং খুবই ইম্পর্ট্যান্ট কন্সেপ্ট আমরা শিখে ফেলবো আর সেটা হলো স্ট্রিং। স্ট্রিং মানে কিন্তু দড়ি। বাট প্রোগ্রামিং এর ভাষায় স্ট্রিং মানে হলো একটা শব্দ বা বাক্য। এগুলো কিভাবে তৈরি হয়? অনেকগুলো বর্ণ একসাথে হয়ে তারপর এক একটা শব্দ তৈরি হয়। অনেকটা দড়ি দিয়ে বর্ণগুলো জোড়া লাগানোর মতো। তাই এটা হলো স্ট্রিং।
সো আজকের মডিউলে এই স্ট্রিং এর বেসিক কন্সেপ্ট গুলো তোমাদের শেখানো হবে। যেমন ধরো এই স্ট্রিংটা আসলে কি? এটার কাজ কি? কিভাবে কোন একটা স্ট্রিং ইনপুট নিতে হয়, প্রিন্ট করে দেখাতে হয় সব কিছু দেখানো হবে। সাথে আরো দেখানো হবে কিভাবে একটা স্ট্রিং এর লেন্থ বের করতে হয়ে অর্থাৎ সেই স্ট্রিং এ কয়টা বর্ণ আছে সেটার পরিমান। এছাড়া আরো টুকটাক কয়েকটা এক্সাইটিং জিনিসপত্র তো আছেই। তাই আর দেরী না করে গরম গরম শুরু করে দাও।
Question Links -
Module ১০-১ + ১০-২ : স্ট্রিং কি
স্ট্রিং হচ্ছে মূলতো ক্যারেক্টার এরে।
char arr[20]; এরকম।
এই ক্যারেক্টার টাইপ এরেকে স্ট্রিং নাম দেওয়া হয়েছে কারন সি প্রোগ্রামিং এ একে আলাদা কিছু পাওয়ার দেওয়া হয়েছে। এই পাওয়ার গুলো আমরা সামনে দেখবো।
এবার আমরা ক্যারেক্টার এরেতে ইনপুট এবং আউটপুট দেখে নিই।
Code (Character Array Input and Output):
#include <stdio.h>
int main()
{
char ar[5]; // ৫ সাইজের ক্যারেক্টার এরে ডিক্লেয়ার করা হয়েছে।
for(int i=0; i<5; i++) // ০ থেকে ৪ পর্যন্ত লুপ চালানো হচ্ছে।
{
scanf("%c", &ar[i]); // প্রতিটি ইন্ডেক্সে একটি করে ক্যারেক্টার ইনপুট নেওয়া হচ্ছে %c দিয়ে
}
for(int i=0; i<5; i++) // লুপ চালিয়ে প্রতিটি ইন্ডেক্সে যেয়ে
{
printf("%c", ar[i]); // ক্যারেক্টারটি প্রিন্ট করা হচ্ছে।
}
return 0;
}কোডটি রান করে আমরা ৫ সাইজের কোন স্ট্রিং ( ৫টি ক্যারেক্টার )ইনপুট দিলে আউটপুট পেয়ে যাব। এখানে লক্ষ্যনীয় হচ্ছে ৫টি ক্যারেক্টার ইনপুট দেওয়ার সময় মাঝে কোন স্পেস দেওয়া যাবে না। স্পেস দিলে স্পেসটিও ইনপুট হিসেবে নিয়ে নিবে যেহেতু স্পেস নিজেও একটি ক্যারেক্টার।
একটি ভেরিয়েবল মেমরিতে কত জায়গা নিচ্ছে তা আমরা বের করতে পারি sizeof() দিয়ে। আমরা যদি sizeof(int) প্রিন্ট করি তাহলে ৪ প্রিন্ট হবে, কারন একটি int ভেরিয়েবল মেমরিতে ৪ বাইট জায়গা নেয়। তেমনি আমরা যদি একটি int এরে ডিক্লেয়ার করি ৫ সাইজের। তারপর সেই এরে মেমরিতে কত জায়গা নিচ্ছে সেটি জানতে sizeof ব্যবহার করিঃ
Code (Array Size using sizeof):
#include <stdio.h>
int main()
{
int a[5];
printf("%d", sizeof(a));
return 0;
}রান করলে দেখব ২০ প্রিন্ট হচ্ছে। কারন একটি ৫ সাইজের int এরে মেমরিতে (৫ * ৪ = ২০ ) বাইট জায়গা নেয়। এখন আমরা যদি এক্সাক্টলি এরের সাইজ বের করতে চাই sizeof দিয়ে, তাহলে আমরা এরের সাইজকে একটি int এর সাইজ দিয়ে ভাগ করে ফেলতে পারিঃ
Code (Finding Array Size):
#include <stdio.h>
int main()
{
int a[5];
printf("%d", sizeof(a)/sizeof(int)); // এরে মেমরিতে কত জায়গা নেয় (২০) সেটিকে একটি ইন্টিজার ভেরিয়েবল কত জায়গা নেয়(৪) তা দিয়ে ভাগ করা হচ্ছে। তাহলে ভাগফল আসবে ২০ / ৪ = ৫ যা হচ্ছে আমাদের এরের একচুয়াল সাইজ।
return 0;
}সেইমভাবে আমরা একটি ক্যারেক্টার এরের সাইজও বের করতে পারি।
Code (Character Array Size):
#include <stdio.h>
int main()
{
char a[5]; // ৫ সাইজের ক্যারেক্টার এরে নেওয়া হয়েছে।
int sz=sizeof(a)/sizeof(char); // ক্যারেক্টার এরে কতটুকু জায়গা নিচ্ছে সেটিকে একটি ক্যারেক্টার কতটুকু জায়গা নেয় তা দিয়ে ভাগ করা হচ্ছে। তাহলে আমরা ক্যারেক্টার এরের সাইজ পেয়ে যাব।
printf("%d", sz); // ক্যারেক্টার এরের সাইজটি প্রিন্ট করা হচ্ছে।
return 0;
}মডিউল ১০-৩: স্ট্রিং ইনপুট এবং আউটপুট
এবার আমরা স্ট্রিং ইনপুট নিব। ইনপুটের ক্ষেত্রেও স্ট্রিং এর স্পেশাল পাওয়ার আছে। অন্য কোন এরে লুপ না চালিয়ে এক লাইনে ইনপুট নেওয়া যায় না। কিন্তু ক্যারেক্টার এরে অর্থাৎ স্ট্রিং এক লাইনে ইনপুট নেওয়া যায় ঠিক প্রিন্ট এর মতই %s ব্যাবহার করে।
Code (String Input and Output):
#include <stdio.h>
int main()
{
char a[5];
scanf("%s", &a); // %s দিয়ে স্ট্রিং ইনপুট নেওয়া হচ্ছে।
printf("%s\n", a); // %s দিয়ে স্ট্রিং প্রিন্ট করা হচ্ছে।
return 0;
}এই কোডটি রান করে যদি আমরা Hello ইনপুট দেই তাহলে Hello প্রিন্ট হবে। যদিও এটি হওয়ার কথা না কারন আমরা গত মডিউলেই জেনেছি ৫ সাইজের একটি স্ট্রিং Hello স্টোর করতে হলে আমাদের স্ট্রিং ডিক্লেয়ার করার সময় তার সাইজ ৬ বলে দিতে হবে। এখানে আমরা ডিক্লেয়ার করার সময় সাইজ ৫ বলেছি, নাল ক্যারেক্টার বসানোর জায়গা রাখি নি। তাও এটি ঠিকঠাক ভাবে প্রিন্ট হওয়ার কারন হচ্ছে উইন্ডোজ অপারেটিং সিস্টেম। উইন্ডোজ কিছু এক্সট্রা মেমরি এলোকেট করে ফেলে। তাই যদিও আমরা ৫ সাইজের এরে ডিক্লেয়ার করছি কিন্তু সেটার একচুয়াল সাইজ আসলে বেশি। কোন অনলাইন জাজ অথবা লিনাক্স অপারেটিং সিস্টেমে এটি হবে না।
তাই বেস্ট প্র্যাকটিস হচ্ছে আমরা যত সাইজের স্ট্রিং ইনপুট নিতে চাচ্ছি তার থেকে এটলিস্ট ১ সাইজ বেশি ডিক্লেয়ার করা।
Code (String Input with Proper Size):
#include <stdio.h>
int main()
{
char a[6]; // 5 সাইজের স্ট্রিং ইনপুট দেওয়া হবে তাই নাল বসানোর জন্য জায়গা রেখে ৬ সাইজ ডিক্লেয়ার করা হচ্ছে।
scanf("%s", &a); // %s দিয়ে স্ট্রিং ইনপুট নেওয়া হচ্ছে।
printf("%s\n", a); // %s দিয়ে স্ট্রিং প্রিন্ট করা হচ্ছে।
return 0;
}এই কোডটি রান করে যদি আমরা Hello ইনপুট দেই তাহলে প্রোপারলি Hello প্রিন্ট হবে। যেকোন অপারেটিং সিস্টেমে এবং অনলাইন কম্পাইলারেও।
মডিউল ১০-৪: NULL ক্যারেক্টার
নাল ক্যারেক্টার কি?
নাল ক্যারেক্টার হলো একটি বিশেষ ক্যারেক্টার যার ASCII ভ্যালু 0। এটিকে '\0' দ্বারা প্রকাশ করা হয়। এটি C ভাষায় স্ট্রিং-এর টার্মিনেটর (terminator) হিসেবে কাজ করে।
ব্যবহারের নিয়ম
Code (Automatic NULL Character):
char str[10] = "Hello"; // অটোমেটিকভাবে '\0' যুক্ত হয়অথবা
Code (Manual NULL Character):
char str[10] = {'H', 'e', 'l', 'l', 'o', '\0'}; // ম্যানুয়ালি '\0' যুক্ত করাকেন নাল ক্যারেক্টার গুরুত্বপূর্ণ?
স্ট্রিং টার্মিনেশন: C ভাষায় স্ট্রিং-এর শেষ চিহ্নিত করতে '\0' ব্যবহার করা হয়।
স্ট্রিং ফাংশন: strlen(), printf(), strcpy() এর মত ফাংশনগুলো '\0' দেখে স্ট্রিং-এর শেষ বোঝে।
উদাহরণ
Code (NULL Character Example):
#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "Bangladesh"; // অটোমেটিক '\0' যুক্ত
char str2[20] = {'D', 'h', 'a', 'k', 'a', '\0'}; // ম্যানুয়ালি '\0' যুক্ত
printf("str1: %s\n", str1);
printf("str2: %s\n", str2);
return 0;
}আউটপুট:
str1: Bangladesh
str2: Dhakaমডিউল ১০-৫ + ১০-৬: স্ট্রিং ইনপুট স্পেস সহ
scanf("%s") দিয়ে ইনপুট নেওয়ার একটি প্রবলেম হচ্ছে, scanf ইনপুটে স্পেস পাওয়ার সাথে সাথে থেমে যায়। অর্থাৎ স্পেস সহ স্ট্রিং ইনপুট নেওয়া যায় না scanf দিয়ে।
Code (scanf Problem with Space):
#include <stdio.h>
int main()
{
char a[12];
scanf("%s", &a);
printf("%s\n", a);
return 0;
}কোডটি রান করে আমরা যদি Hello World ইনপুট দেই। তাহলে দেখব শুধু Hello প্রিন্ট হচ্ছে। স্পেস এর পরের অংশটুকু ইনপুট নেয় নি।
এটা scanf দিয়ে করা পসিবল না। scanf স্পেস পেলেই ইনপুট নেওয়া অফ করে দেয়। তাই এটার জন্য আমরা ২টি ফাংশন ব্যাবহার করতে পারি। gets এবং fgets।
gets কিভাবে ব্যাবহার করতে হয় আমরা দেখে নেইঃ
Code (Using gets):
#include <stdio.h>
#include <string.h> // gets একটি বিল্ট-ইন ফাংশন, এটি ব্যাবহার করতে হলে এই হেডার ফাইলটি ইনক্লুড করতে হয়।
int main()
{
char a[20];
gets(a); // gets স্পেস সহ স্ট্রিং ইনপুট নিতে পারে। যতক্ষন না ইনপুটে এন্টার না দেওয়া হচ্ছে ততক্ষন gets ইনপুট নিতে থাকে।
printf("%s", a); // স্পেস সহ সম্পূর্ণ স্ট্রিং প্রিন্ট হবে।
return 0;
}এবার আমরা দেখব fgets কিভাবে ব্যাবহার করতে হয়ঃ
Code (Using fgets):
#include <stdio.h>
#include <string.h> // fgets ব্যাবহার করতে হলেও এই হেডার ফাইলটি ইনক্লুড করতে হয়।
int main()
{
char a[100];
fgets(a, 20, stdin); // fgets এর মধ্যে শুরুতে স্ট্রিং এর নাম বলে দিতে হয়, তারপর কত সাইজ ইনপুট নিব সেটার সাইজ দিতে হয় নাল সহ, তারপর stdin এই কিওয়ার্ডটি দিতে হয়।
printf("%s", a);
return 0;
}এই কোডটি রান করে আমরা যত বড় ইনপুটই দেই না কেন fgets শুধুমাত্র ১৯টি ক্যারেক্টার ইনপুট নিবে। কারন আমরা fgets এর মধ্যে ইনপুট সাইজ ২০ বলে দিয়েছি। তাই সে ১৯টি ইনপুট নিবে এবং লাস্টেরটায় নাল বসাবে।
মডিউল ১০-৭ + ১০-৮: স্ট্রিং ইনিশিয়ালাইজ
আমরা বলেছিলাম স্ট্রিং এর কিছু স্পেশাল পাওয়ার আছে। প্রথম পাওয়ারটি হলো ইনিশিয়ালাইজেশন। স্ট্রিং নরমালি অন্য এরের মতো ইনিশিয়ালাইজ করা যায় আবার এক লাইনেও ইনিশিয়ালাইজ করা যায়।
Code (String Initialization - Array Style):
char a[5] = {'R', 'a', 'h', 'a', 't'}; // অন্য এরের মতো {} ব্রাকেট দিয়ে কমা দিয়ে দিয়ে ভেলু দিয়ে ইনিশিয়ালাইজ করা যায়।Code (String Initialization - String Literal):
char a[5] = "Rahat"; // স্পেশাল পাওয়ারঃ এক লাইনে ব্রাকেট কমা ছাড়া জাস্ট ডাবল কোটেশনের মধ্যে রেখেও ইনিশিয়ালাইজ করা যায়।স্ট্রিং এর আরেকটি স্পেশাল পাওয়ার হচ্ছে প্রিন্ট করা। অন্য এরে আমাদের প্রিন্ট করতে হলে লুপ চালিয়ে একটি একটি ইন্ডেক্সে যেয়ে প্রিন্ট করতে হতো। স্ট্রিং এ তা করতে হয় না। স্ট্রিং সরাসরি এক লাইনে কোন লুপ না চালিয়ে একটি printf দিয়ে প্রিন্ট করে ফেলা যায়। এক্ষেত্রে স্ট্রিং প্রিন্ট হচ্ছে বুঝানোর জন্য %s ব্যাবহার করতে হয়।
Code (String Printing):
#include <stdio.h>
int main()
{
char a[5] = "Hello";
printf("%s", a);
return 0;
}এই কোডটি রান করলে আমরা দেখতে পারব Hello প্রিন্ট হয়েছে এবং Hello এর পরে আরো কিছু গারবেজ ভেলু প্রিন্ট হয়ে গেছে। আমরা যখন লুপ চালিয়ে স্ট্রিং প্রিন্ট করি তখন আমরা স্পেসিফিক ভাবে বলে দেই যে লুপটি কতবার চলবে। কিন্তু এখানে আমরা %s ব্যাবহার করে প্রিন্ট করছি। এখানে আমরা বলে দিচ্ছি না কোন পর্যন্ত প্রিন্ট করতে হবে। এখানে %s যা করে, সে স্ট্রিং এর শেষ পর্যন্ত প্রিন্ট করে দেয়। এখন কথা হলো সে কিভাবে বুঝবে যে স্ট্রিং কোথায় শেষ? এটি বুঝানোর জন্যই সি প্রোগ্রামিং এ একটি স্পেশাল ক্যারেক্টার আছে তা হলো নাল ক্যারেক্টার। নাল ক্যারেক্টার প্রকাশ করা হয় '\0' দিয়ে। আমরা স্ট্রিং এর শেষে নাল ক্যারেক্টার রেখে দেই, তাহলে %s বুঝতে পারে এখানে স্ট্রিং শেষ এবং তখন সে আর গারবেজ ভেলু প্রিন্ট করে না।
Code (String with NULL Character):
#include <stdio.h>
int main()
{
char a[6] = "Hello\0"; // স্ট্রিং শেষে আমরা নাল ক্যারেক্টার রেখে দিচ্ছি এবং নাল সহ সাইজ ৬ হয় তাই আমরা ৬ সাইজ দিয়েছি।
printf("%s", a);
return 0;
}এই কোডটি রান করলে আমরা দেখব শুধু Hello প্রিন্ট হয়েছে প্রোপারলি। এখন মনে প্রশ্ন জাগতে পারে যে, তাহলে কি আমাকে সবসময় নিজে থেকে নাল ক্যারেক্টার বসিয়ে দিতে হবে? উত্তর হচ্ছে না। আমরা যখন ডাবল কোটেশন দিয়ে স্ট্রিং ইনিশিয়ালাইজ করছি তখন সে অটোমেটিক নাল বসিয়ে দিবে যদি আমি তাকে নাল বসানোর জন্য জায়গা দিয়ে রাখি। প্রথম ক্ষেত্রে আমরা যখন লিখেছিলাম char a[5]="Hello"; তখন আমরা সাইজ দিয়েছি ৫। তাই সে এখানে অটোমেটিক নাল বসাতে পারেনি। কারন নাল বসানোর জায়গা তাকে দেই নি আমরা। আমরা যদি সাইজ ৬ দিতাম তাহলে সে নিজে থেকে নাল বসিয়ে দিত, আমাদের আর কষ্ট করে নাল বসাতে হতো না।
Code (Automatic NULL Character):
#include <stdio.h>
int main()
{
char a[6] = "Hello"; // আমাদের স্ট্রিং ৫ সাইজের কিন্তু আমরা এরে ডিক্লেয়ার করার সময় সাইজ দিচ্ছি ৬। ১ বেশি দেওয়া হচ্ছে নাল ক্যারেক্টার এর জন্য।
printf("%s", a);
return 0;
}এই কোডটি রান করলে দেখব ঠিকঠাক ভাবে Hello প্রিন্ট হচ্ছে। যদিও আমরা এখানে নিজে থেকে নাল বসাই নাই। আমরা শুধু নাল বসানোর জন্য জায়গা রেখে দিয়েছি।
স্ট্রিং ডিক্লেয়ার করার সময় স্ট্রিং এর একচুয়াল সাইজ থেকে ১ বেশি ডিক্লেয়ার করতে হয়, কারন প্রতিটি স্ট্রিং এর শেষে নাল ক্যারেক্টার বসে।
মডিউল ১০-৯ + ১০-১০ + ১০-১১: স্ট্রিং এর লেন্থ
আজকে আমরা একটি স্ট্রিং ইনপুট নিয়ে তার লেন্থ বের করব।
লেন্থ ক্যালকুলেট করার জন্য আমরা একটি কাউন্ট ভেরিয়েবল নিয়ে তাতে শুরুতে ০ রেখে দিতে পারি। এরপর লুপ চালিয়ে স্ট্রিং এর শুরু থেকে শেষ পর্যন্ত যেয়ে প্রতিবার কাউন্ট এর মান ১ বাড়িয়ে দিতে পারি। এক্ষেত্রে স্ট্রিং এর শেষ মানে হচ্ছে যতক্ষন না আমরা নাল কযারেক্টার ('\0') পাচ্ছি। তারপর লুপ শেষে কাউন্ট এর মান প্রিন্ট করলেই আমরা আমাদের লেন্থ পেয়ে যাব।
Code (Manual String Length Calculation):
#include <stdio.h>
#include <string.h>
int main()
{
char a[100];
scanf("%s", a); // স্ট্রিং ইনপুট নিচ্ছি
int count = 0; // কাউন্ট করার জন্য একটি ভেরিয়েবল নিয়ে তাতে ইনিশিয়ালি ০ রেখে দেওয়া হচ্ছে
for(int i=0; a[i]!='\0'; i++) // স্ট্রিং এর শুরু থেকে শেষ পর্যন্ত লুপ চালানো হচ্ছে।
{
count++; // প্রতিবার কাউন্ট এর মান ১ করে বাড়ানো হচ্ছে।
}
printf("%d\n", count);
return 0;
}এই কোডটি রান করে কোন স্ট্রিং ইনপুট দিলে আউটপুট হিসেবে সেটির লেন্থ চলে আসবে।
সি প্রোগ্রামিং এ কোন স্ট্রিং এর লেন্থ বের করার জন্য বিল্ট-ইন ফাংশন আছে। ওই বিল্ট-ইন ফাংশন ব্যাবহার করে আমরা ১ লাইনেই যেকোন স্ট্রিং এর লেন্থ বের করে ফেলতে পারি। ফাংশনের নাম strlen()। এই ফাংশনের মধ্যে কোন স্ট্রিং এর নাম দিয়ে দিলে ফাংশনটি ঐ স্ট্রিং এর লেন্থ বের করে দিবে।
Code (Using strlen Function):
#include <stdio.h>
#include <string.h> // স্ট্রিং ফাংশন নিয়ে কাজ করা হচ্ছে তাই এই হেডার ফাইলটি ইনক্লুড করা হচ্ছে।
int main()
{
char a[100];
scanf("%s", a); // স্ট্রিং ইনপুট নিচ্ছি।
int length = strlen(a); // ফাংশনের মধ্যে আমাদের ইনপুট নেওয়া স্ট্রিংকে দিয়ে দিচ্ছি।
printf("%d\n", length); // লেন্থ প্রিন্ট করছি।
return 0;
}আমরা এভাবে বিল্ট-ইন ফাংশন ব্যাবহার করে যেকোন স্ট্রিং এর লেন্থ বের করতে পারি। তার আগে আমরা বিল্ট-ইন ফাংশন ব্যাবহার না করে দেখলাম যে আসলে এই বিল্ট-ইন ফাংশন কিভাবে কাজ করে। এখন আমরা কাজ বুঝে গিয়েছি। এখন আমরা বিল্ট-ইন ফাংশন ব্যাবহার করেই করতে পারব।
মডিউল ১০-১২: লেটস ইউজ গেটলাইন
প্রবলেম লিংকঃ B. Let's use Getline
প্রবলেম স্টেটমেন্টঃ
ইনপুটে একটি স্ট্রিং দেওয়া থাকবে। স্ট্রিং এর শুরু থেকে '' এই ক্যারেক্টার পর্যন্ত প্রিন্ট করতে হবে।
সল্যুশনঃ
প্রথমে স্ট্রিংটি ইনপুট নিব। যেহেতু স্পেস থাকবে তাই আমরা fgets দিয়ে ইনপুট নিব। তারপর লুপ চালিয়ে স্ট্রিং এর শুরু থেকে প্রিন্ট করা শুরু করব যতক্ষন না আমরা '' এই ক্যারেক্টারটি পাচ্ছি। এটি পেলে প্রিন্ট করা অফ করে দিব।
Code (Let's use Getline):
#include <stdio.h>
int main()
{
char a[1000001];
fgets(a, 1000001, stdin); // স্পেস সহ ইনপুট নিচ্ছি
for(int i=0; a[i] != '\\'; i++) // লুপ চালাচ্ছি স্ট্রিং এর শুর থেকে। লুপ থামিয়ে দিব যখন আমরা স্ট্রিং এর মধ্যে \ এই ক্যারেক্টারটি পাব। সি প্রোগ্রামিং এ \ এটি বুঝানোর জন্য '\\' এভাবে লিখতে হয়।
{
printf("%c", a[i]); // প্রতিবার ক্যারেক্টার প্রিন্ট হচ্ছে। লুপ থামলে প্রিন্ট করা থেমে যাবে।
}
return 0;
}মডিউল ১০-১৩: কাউন্ট
প্রবলেম লিংকঃ E. Count
প্রবলেম স্টেটমেন্টঃ
ইনপুটে একটি স্ট্রিং দেওয়া থাকবে। স্ট্রিং এর নাম্বার গুলোর যোগফল প্রিন্ট করতে হবে।
সল্যুশনঃ
প্রথমে স্ট্রিংটি ইনপুট নিব। যেহেতু স্পেস থাকবে না স্ট্রিং এর মধ্যে তাই আমরা নরমালি scanf দিয়েই ইনপুট নিতে পারব। তারপর লুপ চালিয়ে স্ট্রিং এর শুরু থেকে শেষ পর্যন্ত প্রতিটি ডিজিট যোগ করতে থাকব। এখানে যোগ করার সময় প্রতিটি ডিজিট থেকে ৪৮ অর্থাৎ '০' এর আসকি ভেলু বিয়োগ করতে হবে, কারন নাম্বার গুলো আমরা ইন্টিজার হিসেবে ইনপুট নিচ্ছি না, ক্যারেক্টার হিসেবে ইনপুট নিয়েছি। তারপর লুপ শেষে যোগফল প্রিন্ট করে দিলেই হয়ে যাবে।
Code (Count):
#include <stdio.h>
#include <string.h>
int main()
{
char a[1000001];
scanf("%s", a);
int sum=0; // যোগফল রাখার জন্য ভেরিয়েবল নিয়ে তাতে শুরুতে ০ রাখা হচ্ছে।
for(int i=0; i<strlen(a); i++) // লুপ চালানো হচ্ছে স্ট্রিং এর শুরু থেকে শেষ পর্যন্ত
{
sum=sum+(a[i]-'0'); // প্রতিটি ডিজিটে যেয়ে সেই ডিজিট থেকে ০ এর আসকি ভেলু বিয়োগ করা হচ্ছে। কারন নাম্বার গুলো আমরা ক্যারেক্টার হিসেবে ইনপুট নিয়েছি।
}
printf("%d", sum); // যোগফল প্রিন্ট করছি।
return 0;
}