Theory
पोशाक वाली party
आप 3 lessons से %d और %f पर भरोसा करते आए हैं। अब इन्हें decode करने का समय है।
यह experiment मन में चलाइए: printf("%d", 78.5);, एक float को int की पोशाक में print करना। Output न 78 है, न 79, बल्कि garbage: शायद -1717986918।
printf यह नहीं जाँचता कि कौन क्या पहने है। Type specifier उसे बताता है कि कच्चे bytes कैसे पढ़ने हैं, और गलत पोशाक में पढ़े bytes बेतुके बन जाते हैं। मेहमानों से पोशाक मिलाना ही आज की पूरी कला है।
Theory
आकार वाली खाली जगहों से fill-in-the-blanks
printf की format string खाली जगहों वाला वाक्य है: "Marks: __, Grade: __"। पर हर खाली जगह का एक आकार है: %d वाली खाली जगह में int बैठता है, %c वाली में एक character, %f वाली में एक decimal। int-आकार वाली खाली जगह में float ठूँसिए और वह बिगड़कर निकलता है, जैसे गोल dabba को चौकोर खाँचे में ठूँसना। खाली जगहें specifiers हैं; आकार मेल खाने चाहिए।
At a glance
Specifier परिवार
| Specifier | Type | उदाहरण value |
|---|---|---|
| %d | int | 78 |
| %ld | long | 8930012345 |
| %f | float (printf: double भी) | 78.500000 |
| %lf | double (scanf में ज़रूरी) | 78.53 |
| %c | char (एक character) | A |
| %s | string (char array) | Riya |
Practical
एक marksheet, हर specifier
#include <stdio.h>
int main() {
char name[20] = "Riya";
int marks = 78;
float percentage = 78.53;
char grade = 'A';
printf("Name : %s\n", name);
printf("Marks: %d\n", marks);
printf("Perc : %.2f\n", percentage);
printf("Grade: %c (ASCII %d)\n", grade, grade);
return 0;
}This example runs in Gri-Learn on the web, where you can edit it and see the output.
Think first
एक char, 2 पोशाकें
आख़िरी printf grade को 2 बार print करता है: एक बार %c से और एक बार %d से। char असल में क्या है, यह इस्तेमाल करते हुए उस line का ठीक-ठीक output बताइए।
Show the answer
Grade: A (ASCII 65)
वही variable, वही byte: %c उसे character (A) की तरह पहनाता है, %d उसके number (65) की तरह। कुछ convert नहीं होता; सिर्फ़ पढ़ने की पोशाक बदलती है। यही एक line सबसे साफ़ सबूत है कि char भेस बदले एक ASCII number है, और predict-the-output का चहेता item।
Quiz
printf("%d", 78.5); असल में क्या print करता है?
- अनिश्चित garbage: bytes गलत format में पढ़े जाते हैं
- 78, C decimal हिस्सा हटा देता है
- 79, C इसे round करता है
- 78.5, printf अपने आप adjust कर लेता है
Show the answer
अनिश्चित garbage: bytes गलत format में पढ़े जाते हैं
Float के bytes int के lens से पढ़े जाएँ तो बेमतलब हैं: output garbage है और formally undefined behaviour। 78 तक काटने वाला जवाब इसे ASSIGNMENT से गड्डमड्ड करता है (int x = 78.5 वाक़ई काटता है); printf कुछ convert नहीं करता, वह सिर्फ़ bytes को कहे अनुसार पढ़ता है। इन 2 हालतों में फ़र्क़ करना ही examiner टटोल रहे हैं।
Quiz
आप scanf से एक double पढ़ रहे हैं। कौन सा specifier ज़रूरी (REQUIRED) है?
- %lf
- %f
- %d
- %s
Show the answer
%lf
scanf को ठीक-ठीक पता होना चाहिए कि वह कितने बड़े डिब्बे को भर रहा है: %f 4 float bytes भरता है, %lf 8 double bytes, इसलिए double को %lf चाहिए ही। यह असंतुलन सबको फँसाता है: printf में %f खुशी-खुशी float और double दोनों print कर देता है। answer sheet के हाशिए के लिए छोटा नियम: scanf सख़्त है, printf उदार है।
Watch out
Marks कहाँ कटते हैं
गलत जोड़ियाँ: floats के साथ %d, ints के साथ %f, दोनों तरफ़ garbage। char पर %c बनाम %d बदल देता है कि क्या दिखेगा (A बनाम 65), देखिए सवाल किसे चाहता है। scanf में यह भूलना कि double के लिए %lf ज़रूरी है। और marks दिलाने वाली एक साफ़ आदत: %.2f 2 decimals print करता है (78.530000 की जगह 78.53), display round होता है, store की गई value अछूती रहती है।
Theory
Unit 1 पूरा हुआ
देखिए marks program अब क्या कर सकता है: typed डिब्बे declare करना, input लेना, operators से गणना, और formatted marksheet print करना, Unit 1 का हर topic अब theory नहीं, अभ्यास है। आज के code में एक छोटी झलक छिपी थी: %s के लिए scanf को & नहीं चाहिए, क्योंकि array का नाम पहले से एक पता है; वह रहस्य Unit 3 (arrays और pointers) में खुलता है। आगे: Unit 2, जहाँ program फ़ैसले लेना शुरू करता है।
Summary
Key takeaways
- Specifiers printf/scanf को bytes पढ़ने का तरीक़ा बताते हैं: %d int, %ld long, %f float, %lf double, %c char, %s string।
- Mismatch = garbage: printf कुछ convert नहीं करता (%d के साथ 78.5 undefined है)।
- scanf सख़्त है (double के लिए %lf ज़रूरी); printf उदार है (%f दोनों print करता है)।
- एक ही char पर %c बनाम %d: अक्षर बनाम ASCII number।
- %.2f DISPLAY को 2 decimals तक छाँटता है; store की गई value वही रहती है।
- याद रखने का hook: आकार वाली खाली जगहें, पोशाक मेहमान से मेल खानी चाहिए।