Lesson পড়তে ৭ মিনিট লাগবে

printf এবং scanf-এর ইনপুট এবং আউটপুট (Input & Output with printf and scanf)

এখানকার printf হলো আপনার মেগাফোন (megaphone), আর scanf হলো আপনার মাইক্রোফোন (microphone)

মেগাফোন এবং মাইক্রোফোন (Megaphones and Microphones)

প্রতিটি প্রোগ্রামেরই (program) মূলত বাইরের জগতের (outside world) সাথে কথা বলার প্রয়োজন পড়ে। আর সি-তে (C), printf-ই হলো আপনার মেগাফোন (megaphone) — এটি মূলত স্ক্রিনে (screen) আপনার আউটপুটগুলোকে (output) ফরম্যাট (formatted) করে সবাইকে চিৎকার (shouts) করে বলে। অন্যদিকে scanf হলো আপনার মাইক্রোফোন (microphone) — এটি মূলত কীবোর্ড (keyboard) থেকে ইনপুট (input) শোনার জন্য সবসময় কান পেতে বসে থাকে এবং এরপর সেগুলোকে আপনার ভ্যারিয়েবলগুলোতে (variables) স্টোর (stores) বা সংরক্ষণ করে রাখে।

আর এই উভয় ফাংশনই ফরম্যাট স্পেসিফায়ার (format specifiers) ব্যবহার করে থাকে — এগুলো মূলত % দিয়ে শুরু হওয়া ছোট্ট কিছু কোড (codes) যা সি-কে (C) বলে দেয় যে এখান থেকে ঠিক কোন ধরনের (type) ডেটা (data) আশা (expect) করা উচিত। এই স্পেসিফায়ারগুলোতে (specifier) কোনো ভুল করলে, আপনি হয়তো স্ক্রিনে (screen) শুধু কিছু গারবেজ (garbage) বা আবর্জনা দেখতে পাবেন বা এর ফলে আপনার প্রোগ্রামটিও (program) পুরোপুরি ক্র্যাশ (crash) করে যেতে পারে।

ফরম্যাট স্পেসিফায়ার (Format Specifiers) — দ্য রোজেটা স্টোন (The Rosetta Stone)

নিচে এরকমই কিছু ফরম্যাট স্পেসিফায়ার (format specifiers) দেওয়া হলো যেগুলো আপনি প্রতিনিয়তই (constantly) ব্যবহার করবেন:

  • %d অথবা %iint (ডেসিমাল ইনটিজার বা decimal integer)
  • %uunsigned int (আনসাইনড ইনটিজার)
  • %ffloat অথবা double (printf-এর ক্ষেত্রে)
  • %lfdouble (scanf-এর ক্ষেত্রে এটি বাধ্যতামূলক বা required)
  • %cchar (যেকোনো একক ক্যারেক্টার বা single character)
  • %s — স্ট্রিং বা string (যেকোনো char অ্যারে বা char array)
  • %x — হেক্সাডেসিমাল বা hexadecimal, %o — অক্টাল বা octal
  • %p — পয়েন্টার অ্যাড্রেস বা pointer address
  • %zusize_t (sizeof-এর ফলাফল বা result)
  • %% — আক্ষরিক বা লিটারেল (literal) শতাংশের চিহ্ন বা percent sign

সাধারণ বা বেসিক printf (printf Basics)

#include <stdio.h>
int main() {
int age = 25;
float gpa = 3.87f;
char initial = 'J';
char name[] = "John";
printf("Name: %s\n", name);
printf("Initial: %c\n", initial);
printf("Age: %d\n", age);
printf("GPA: %f\n", gpa);
// হেক্স এবং অক্টাল (Hex and octal)
printf("255 in hex: %x\n", 255);
printf("255 in octal: %o\n", 255);
return 0;
}
Output
Name: John
Initial: J
Age: 25
GPA: 3.870000
255 in hex: ff
255 in octal: 377

আউটপুট ফরম্যাটিং (Formatting Output) — প্রস্থ এবং নির্ভুলতা বা উইথ এবং প্রিসিশন (Width & Precision)

আপনি চাইলে আপনার আউটপুটটি (output) ঠিক কেমন দেখাবে, তা খুব সহজেই নিয়ন্ত্রণ (control) করতে পারেন। এর % এবং স্পেসিফায়ার লেটারটির (specifier letter) মাঝে, আপনি চাইলে এর প্রস্থ বা width (ন্যূনতম কতগুলো ক্যারেক্টার থাকবে) এবং এর নির্ভুলতা বা precision (মোট কতগুলো দশমিক স্থান বা decimal places থাকবে)-এর জন্য কিছু নির্দিষ্ট সংখ্যাও (numbers) যোগ করতে পারবেন।

ফরম্যাটেড আউটপুট (Formatted Output)

#include <stdio.h>
int main() {
double price = 9.5;
int qty = 3;
// %.2f = ২ দশমিক স্থান বা 2 decimal places
printf("Price: $%.2f\n", price);
// %8d = রাইট-অ্যালাইনড (right-aligned), ৮ ক্যারেক্টার উইথ বা 8 characters wide
printf("Qty: [%8d]\n", qty);
// %-8d = লেফট-অ্যালাইনড (left-aligned), ৮ ক্যারেক্টার উইথ বা 8 characters wide
printf("Qty: [%-8d]\n", qty);
// %08d = জিরো-প্যাডেড (zero-padded), ৮ ক্যারেক্টার উইথ বা 8 characters wide
printf("Code: %08d\n", 1234);
// উইথ (width) এবং প্রিসিশনকে (precision) একসাথে যুক্ত বা কম্বাইনিং (Combining) করা
printf("Pi: [%10.4f]\n", 3.14159);
return 0;
}
Output
Price: $9.50
Qty: [       3]
Qty: [3       ]
Code: 00001234
Pi: [    3.1416]

এসকেপ সিকোয়েন্স (Escape Sequences)

এগুলো মূলত স্পেশাল ক্যারেক্টারের কিছু কম্বাইন (combo) যেগুলো সাধারণত এই \-এর মাধ্যমে শুরু হয়:

  • \n — নিউলাইন বা newline (পরের লাইনে যাওয়ার জন্য)
  • \t — ট্যাব বা tab (অনুভূমিক ইনডেন্ট বা horizontal indent-এর জন্য)
  • \\ — আক্ষরিক ব্যাকস্ল্যাশ বা literal backslash
  • \" — যেকোনো স্ট্রিংয়ের (string) ভেতরের আক্ষরিক ডাবল কোট বা literal double quote
  • \' — আক্ষরিক সিঙ্গেল কোট বা literal single quote
  • \0 — নাল ক্যারেক্টার বা null character (এটি মূলত স্ট্রিং টার্মিনেটর বা string terminator)

কার্যকর বা অ্যাকশনে থাকা এসকেপ সিকোয়েন্স (Escape Sequences in Action)

#include <stdio.h>
int main() {
printf("Column1\tColumn2\tColumn3\n");
printf("-------\t-------\t-------\n");
printf("Alice\t95\tA\n");
printf("Bob\t87\tB+\n");
printf("\nShe said \"hello\"\n");
printf("Path: C:\\Users\\docs\n");
return 0;
}
Output
Column1	Column2	Column3
-------	-------	-------
Alice	95	A
Bob	87	B+

She said "hello"
Path: C:\Users\docs

scanf — ইনপুট রিড বা পড়া (Reading Input)

এই scanf ফাংশনটি (function) মূলত কীবোর্ড (keyboard) থেকে এর সমস্ত ফরম্যাটেড ইনপুটগুলোকে রিড (reads) করে। এর সবচেয়ে গুরুত্বপূর্ণ নিয়মটি (critical rule) হলো: এখানকার & অপারেটরটি (operator) ব্যবহার করে আপনাকে অবশ্যই ভ্যারিয়েবলটির (variable) অ্যাড্রেসটিকে (address) পাস (pass) করতে হবে। এর কারণ হলো scanf-কে সবসময় জানতে হয় বা দরকার পড়ে যে, মেমোরির ঠিক কোথায় (where) ওই ভ্যালু বা মানটিকে (value) স্টোর (store) করে রাখতে হবে।

তবে এর মাত্র একটি ব্যতিক্রম (exception) আছে: অ্যারেগুলো (arrays) (স্ট্রিং বা string-সহ) যেহেতু আগে থেকেই মূলত একেকটি অ্যাড্রেস (addresses), তাই এই %s-এর সাথে আপনার কোনো & ব্যবহার করার প্রয়োজন নেই।

সাধারণ বা বেসিক scanf (scanf Basics)

#include <stdio.h>
int main() {
int age;
double height;
char initial;
char name[50];
printf("Enter your first name: ");
scanf("%s", name); // অ্যারের বা arrays-এর জন্য কোনো & লাগবে না!
printf("Enter your initial: ");
scanf(" %c", &initial); // এই %c-এর আগের স্পেসটি (Space) মূলত এর হোয়াইটস্পেসগুলোকে (whitespace) স্কিপ (skips) বা এড়িয়ে যায়
printf("Enter your age: ");
scanf("%d", &age); // এর জন্য & বাধ্যতামূলক বা required!
printf("Enter your height (m): ");
scanf("%lf", &height); // scanf-এর যেকোনো double-এর জন্য %lf
printf("\n--- আপনার ইনফো বা তথ্য (Your Info) ---\n");
printf("Name: %s\n", name);
printf("Initial: %c\n", initial);
printf("Age: %d\n", age);
printf("Height: %.2f m\n", height);
return 0;
}
Output
Enter your first name: Alice
Enter your initial: A
Enter your age: 22
Enter your height (m): 1.68

--- Your Info ---
Name: Alice
Initial: A
Age: 22
Height: 1.68 m
Note: scanf-এর সাথে সম্পর্কিত দুটি সবচেয়ে বড় ফাঁদ বা ভুল (Two big scanf pitfalls):
1. এই &-কে ভুলে যাওয়া (Forgetting &)scanf("%d", &age)-এর বদলে শুধু scanf("%d", age) লিখলে, বেশিরভাগ কম্পাইলারই (compilers) আপনাকে কোনো প্রকার এরর বা error দেবে না, কিন্তু এটি মূলত আপনার প্রোগ্রামটিকে (program) সম্পূর্ণ ক্র্যাশ (crash) কিংবা মেমোরিটিকে পুরোপুরি করাপ্ট বা নষ্ট (corrupt memory) করে দেবে। যেকোনো নন-অ্যারে ভ্যারিয়েবলের (non-array variables) জন্য সবসময় & ব্যবহার করা উচিত!
2. %s-এর কারণে বাফার ওভারফ্লো (Buffer overflow with %s) হওয়া — ব্যবহারকারী বা ইউজার (user) যদি char name[10]-এর ভেতরে ১০০-ক্যারেক্টারের (100-character) কোনো নাম (name) টাইপ (types) করে ফেলে, তবে আপনি একটি বাফার ওভারফ্লোর (buffer overflow) সম্মুখীন হবেন। আর এর ইনপুটকে (input) লিমিট (limit) বা সীমাবদ্ধ করতে মূলত %49s (যার সাইজ অ্যারের থেকে এক কম) ব্যবহার করা ভালো: scanf("%49s", name)

মাল্টিপল বা একাধিক ভ্যালু রিড (Reading Multiple Values) করা

#include <stdio.h>
int main() {
int day, month, year;
printf("Enter date (dd/mm/yyyy): ");
scanf("%d/%d/%d", &day, &month, &year);
printf("Day: %02d\n", day);
printf("Month: %02d\n", month);
printf("Year: %d\n", year);
return 0;
}
Output
Enter date (dd/mm/yyyy): 15/03/2026
Day:   15
Month: 03
Year:  2026
চ্যালেঞ্জ

ছোট কুইজ

scanf-এ double-এর জন্য আপনি ঠিক কোন ফরম্যাট স্পেসিফায়ারটি (format specifier) ব্যবহার করবেন?
Operators & ExpressionsConditionals