printf এবং scanf-এর ইনপুট এবং আউটপুট (Input & Output with printf and scanf)
মেগাফোন এবং মাইক্রোফোন (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অথবা%i—int(ডেসিমাল ইনটিজার বা decimal integer)%u—unsigned int(আনসাইনড ইনটিজার)%f—floatঅথবাdouble(printf-এর ক্ষেত্রে)%lf—double(scanf-এর ক্ষেত্রে এটি বাধ্যতামূলক বা required)%c—char(যেকোনো একক ক্যারেক্টার বা single character)%s— স্ট্রিং বা string (যেকোনো char অ্যারে বা char array)%x— হেক্সাডেসিমাল বা hexadecimal,%o— অক্টাল বা octal%p— পয়েন্টার অ্যাড্রেস বা pointer address%zu—size_t(sizeof-এর ফলাফল বা result)%%— আক্ষরিক বা লিটারেল (literal) শতাংশের চিহ্ন বা percent sign
সাধারণ বা বেসিক printf (printf Basics)
আউটপুট ফরম্যাটিং (Formatting Output) — প্রস্থ এবং নির্ভুলতা বা উইথ এবং প্রিসিশন (Width & Precision)
আপনি চাইলে আপনার আউটপুটটি (output) ঠিক কেমন দেখাবে, তা খুব সহজেই নিয়ন্ত্রণ (control) করতে পারেন। এর % এবং স্পেসিফায়ার লেটারটির (specifier letter) মাঝে, আপনি চাইলে এর প্রস্থ বা width (ন্যূনতম কতগুলো ক্যারেক্টার থাকবে) এবং এর নির্ভুলতা বা precision (মোট কতগুলো দশমিক স্থান বা decimal places থাকবে)-এর জন্য কিছু নির্দিষ্ট সংখ্যাও (numbers) যোগ করতে পারবেন।
ফরম্যাটেড আউটপুট (Formatted Output)
এসকেপ সিকোয়েন্স (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)
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)
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)।