Showing posts with label format specifiers in C. Show all posts
Showing posts with label format specifiers in C. Show all posts

Tuesday, 10 December 2013

scanf function in C language

मागील पोस्ट मध्ये मी printf function बद्दल सांगीतले होते. त्या फंक्शनची जोडीदारीण म्हणजे scanf function. अर्थातच printf function जर output साठी वापरण्यात येत असले तर scanf हे input घेण्यासाठी वापरण्यात येते. जवळपास सर्वच program मध्ये जोडीने फीरतांना तुम्हाला हे आढळतील...!

इंग्रजी मध्ये एखाद्याचे inspection किंवा screening करायचे असेल तर scanning हा शब्द वापरला जातो. मला कधी कधी वाटतं युझरने भरलेली व keyboard च्या आत दडलेली value मेमरीमध्ये चपखलपणे नेउन ठेवण्याचे काम करणारे हे फंक्शन आहे म्हणून scanf असे नाव ठेवले आहे. गंम्मत म्हणजे Java मध्ये अशा प्रकारचे फंक्शन जरी नसले तरी Java मध्ये input घेण्यासाठी object तयार करायला लागतो व त्या object च्या class चे नाव Scanner ठेवले आहे...!

printf function व इतर अनेक फंक्शन्स प्रमाणेच input घेण्याची व्यवस्था सुद्धा डेनीसनं C language मध्ये built in केली नव्हती. त्यामुळे हे फंक्शन सुद्धा compiler च्या library मध्ये उपलब्ध आहे व stdio.h या header file मध्ये त्याचा prototype आहे. तो सर्वसाधारणपणे 

int     _Cdecl scanf(const char *__format, ...);

असा आहे. आता याच फंक्शनचे scanning करायचे म्हणले तर 

scanf function integer return करते. 
printf function प्रमाणेच याचे calling convention _Cdecl आहे. 
याचे पहीले argument स्ट्रिंग असते
पुढील argument सुद्धा printf function प्रमाणे Ellipsis म्हणजेच 3 dots (...) आहे. म्हणूनच मागील पोस्ट मध्ये सांगीतल्या प्रमाणे हे फंक्शन सुद्धा variable number of arguments म्हणजेच any number of arguments घेउ शकते.              

scanf या फंक्शन मध्ये printf function प्रमाणे पहीले argument जरी string असले तरी या स्ट्रिंग मध्ये फॉर्मॅट स्पेसीफायर काही अपवाद वगळता कोणतीही इतर कॅरेक्टर्स लिहून नयेत. त्यामुळे समजा एक इंटीजर input घ्यायचा असेल व x या व्हेअरेबल मध्ये स्टोअर करायचा असेल तर स्टेटमेंट

scanf("%d",&x); 

असे असेल. स्ट्रिंग नंतर जी arguments ची लिस्ट असते त्या मध्ये व्हेअरेबल्सची मेमरी द्यावी लागते. म्हणून व्हेअरेबल च्या नावा समोर ampersand म्हणजेच address operator जोडतात. जर व्हेअरेबल स्वत:च pointer variable असेल तर ampersand जोडण्याची गरज उरत नाही. उदा. 

int x; 
int *ptr = &x;

scanf("%d",ptr); 

असे लिहीले तर keyboard कडून input केलेली value x मध्ये स्टोअर केली जाइल. समजा आपल्याला अनेक integer, real, characters input करून घ्यायच्या आहेत तर तुम्ही 

scanf("%d%f%c",&x,&y,&ch);

असे लिहू शकता. व या format specifiers व्यतीरीक्त इतर कोणतीही characters या string च्या आत लिहू नयेत. अनेक वेळा अनवधानाने escape sequence लिहीण्याची चुक विद्यार्थ्यांच्या कडुन होते व compile अथवा run time error सुद्धा मिळत नाही पण output मात्र चूकीचे मिळते. 

मी एक छोटासा प्रोग्रॅम खाली देते आहे. पहा हवं तर टाइप आणी रन करून...

#include<stdio.h>
void main( )
{
        char line[200];
        printf("Enter Sentence\n");
        scanf("%[^\n]",line);
        printf("%s",line);
}

मी अजून एक गंम्मत सांगते पोस्ट संपवायच्या पुर्वी.... कारण तसं म्हणल ना तर printf आणी scanf वर मला खुप काही सांगायचयं तुम्हाला पण मी एकाच पोस्ट मध्ये नाही लिहीत सगळं... कारण खुप काही आहे...सांगेन मी तुम्हाला

तर printf आणी scanf यांना print function आणी scan function असे म्हणतात हे ठिक आहे पण f हा function साठी राखीव नसून formatted साठी राखीव आहे...!

C is really mysterious language... Life long... 




Wednesday, 4 December 2013

printf function in C

C language मध्ये printf म्हणजेच print function ची ओळख पहील्याच दिवशी होते. डेनीस रिची ला C language हि compact form मध्येच हवी होती. म्हणून जाणीवपुर्वक त्याने input/output ची सोय language च्या definition मध्ये केलेली नाही. अर्थात printf हे फंक्शन C language चा inherent part आहे अशी अनेक जणांची सुरवातीला समजूत होते हा भाग वेगळा. 




printf function हे formatted console I/O functions या category मध्ये येते. प्रथम मी या category चा अर्थ काय आहे ते सांगते. 


  1. Console : या शब्दाचे अनेक अर्थ आहेत. English मध्ये त्याचा अर्थ सांत्वंन करणे असा आहे. तर Computer मध्ये keyboard व monitor चे combination, display monitor, command line interface, computer terminal असे अनेक आहेत. C language च्या मर्यादीत अर्थ पहायचा असेल तर शक्यतो असे application ज्या वर फक्त text based output अशी स्क्रिन. यालाच console असे शक्यतो ओळखले जाते. व printf function कॉल करून प्रिंट केलेले output console ला म्हणजेच monitor ला पाठवले जाते
  2. Formatted: Console Screen वर output नेमक्या ठिकाणी हवे असेल, दोन शब्दांमध्ये अथवा दोन वाक्यांमध्ये ठरावीक अतंर ठेवायचे असेल, किंवा real number print करतांना decimal point नंतर ठरावीक digits हवे असतील अशा प्रकारचे किंवा तत्सम प्रकारचे formatted output हवे असेल तर ते printf function च्या सहाय्याने करता येते. 
  3. I/O : Input व Output या जोडगोळीचे ते संक्षीप्त स्वरूप आहे. 


हे फंक्शन Compiler च्या library मध्ये उपलब्ध असते व त्याचा प्रोटोटाइप stdio.h या header file मध्ये असतो. तो साधारणपणे 


int     _Cdecl printf(const char *__format, ...);


असा आहे. या prototype वरून कोणती माहीती मिळते...? तर


  • printf function चा return type integer आहे
  • _Cdecl ला printf function चे calling convention म्हणतात. 
  • printf function पहीले argument string घेते
  • printf function चे दुसऱ्या argument मध्ये तीन dots दाखवले आहेत ज्याला ellipsis असे म्हणतात ज्याचा अर्थ variable number of arguments असा आहे. म्हणजेच printf function एक पेक्षा जास्त कितीही arguments घेते.

हे फंक्शन 


  • series of arguments घेते
  • जर पहील्या स्ट्रिंग मध्ये काही format specifiers असतील तर त्या प्रमाणे apply करते
  • आणी formatted data console वर print करते

printf function ची वैशिष्ठे


  • By default printf function print करतांना right hand side ला word wrap facility वापरते
  • \n हे special implementation control character आहे ज्या मध्ये control next line ला नेण्याचे काम करते
  • Screen scroll down करण्याची सुविधा सुद्धा printf function मध्ये built in आहे
  • character print केल्या नंतर cursor next position ला नेण्याचे काम सुद्धा automatically नेण्याची provision आहे
  • पहील्या format specifier ला format नंतरचे पहीले argument connect करण्याचे, दुसऱ्या format specifier ला format नंतरचे दुसरे argument connect करण्याचे व त्याच पद्धतीने पुढील format specifier apply करण्याची built in सुविधा printf function मध्ये आहे


format specifier चा typical form 

% [flags] [width] [.prec] [{h|l}] type

असा आहे. 

या मध्ये अनेक प्रकारचे flags व type आहेत. पण महत्वाचे व नेहमी लागणारे मी येथे घेते. बाकीचे स्पेशल पुढील पोस्ट मध्ये. 

int x = 55;
printf("x = %o",x); 

असे असेल तर o हा एखादा integer number जर octal format मध्ये print करायचा असेल तर वापरतात. या ठिकाणी तुम्हाला output मात्र 

x = 67 

असे येइल. पण तुम्हाला true octal representation हवे असेल तर मात्र printf function 

printf("x = %#o",x);

असे लिहावे लागेल, या ठिकाणी # हा flag आहे . 

समजा तुम्हाला x = 55 या स्टेटमेंट नंतर value print करतांना मात्र +55 अशी हवी असेल तर + flag वापरावा लागेल जसे की 

printf("x = %+d",x); 

समजा आपल्याला 55 च्या अलीकडे 4 zero हवे आहेत. तर 0 असा flag टाकावा लागेल. जसे की

printf("x = %06d",x); 

असे स्टेटमेंट लिहीले तर output 000055 असे मिळेल. 

print होतांना तुम्हाला width specify करायची असेल तर ती सुद्धा देउ शकता. जसे की 

printf("x = %d",x); असे लिहीले तर output 

x = 55 

असे मिळेल. पण समजा

printf("x = 10d",x);

असे लिहीले तर 10 columns जागा राखीव ठेवून मग त्या ठिकाणापासून डाव्या बाजूला printing होइल जसे कि

x =           55

असे होइल. 

समजा 

float y = 6.7;

असे स्टेटमेंट असेल तर 

printf("y = %f",y); 

हे स्टेट्मेंट printing करतांना 

y = 6.700000 

असे करेल. पण जर 

printf("%0.2f",y);

असे लिहीले तर मात्र output

y = 6.70 

असे मिळेल.   
  
C language मध्ये असलेल्या वेगवेगळ्या format specifiers ची माहीती मी या पुर्वीच Blog वर टाकली आहेत


  
   

   

Do you like the C Marathi e-learning concept?