Showing posts with label Library functions. Show all posts
Showing posts with label Library functions. Show all posts

Friday, 15 August 2014

Function of getch function in C language

DOS based TC compiler वापरतांना प्रथमच C language शिकणाऱ्या प्रोग्रॅमरना "getch हे फंक्शन मेन फंक्शन मध्ये शेवटी लिहायचे असते" किंवा फार-फार तर "का लिहायचे" इतकेच माहीत असते. या पलीकडे getch, getche, getchar, gets, fget, इत्यादी एकसारखी फंक्शन्स अंगावर आली की गोंधळ होतोच. म्हणूनच ही पोस्ट. अर्थात हा गोंधळ कमी करण्यासाठी. हा गोंधळ पुर्णपणे जाइल याची शाश्वती मी देत नाही कारण इतक्या वर्षाच्या अनुभवानंतर मला ती पोस्ट लिहायची इच्छा झाली.  

या सर्व फंक्शन बद्दल लिहीण्यासारखे व सांगण्यासारखे खुप असल्यामुळे मी या ठिकाणी एकाच पोस्ट मध्ये सर्व फंक्शन्स न घेता अनेक स्वतंत्र पोस्ट मध्ये लिहीन... 


प्रथम आपण ही कोणती कोणती फंक्शन्स आहेत पाहुया. 
  1. getch
  2. getche
  3. getchar
  4. fgetchar
  5. gets
  6. getc
  7. fgetc
  8. fgets
getch( )
C language programming शिकायला सुरवात केल्यानंतर पहील्या १-२ दिवसातच printf व scanf शिवाय जर कोणते फंक्शन विद्यार्थी वापरत असतील तर ते getch library function. DOS based TC वर प्रोग्रॅम रन करायचा व नंतर output दिसले नाही तर getch function प्रोग्रॅमच्या शेवटी टाकायचे असते अशीच समजूत अनेक जणांची झालेली असते. खरं तर getch function हे get character from the keyboard या मधून तयार झाले आहे... 

या फंक्शनचा prototype तुम्हाला conio.h या header file मध्ये मिळेल म्हणून ही फाइल DOS based TC environment मध्ये stdio.h या हेडर फाइल प्रमाणेच include केली जाते. 

हे फंक्शन आपण ज्या ठिकाणी प्रोग्रॅम मध्ये लिहू व जितके वेळा लिहू त्या-त्या ठिकाणी तेवढ्या वेळा तुम्हाला कि प्रेस करावी लागेल. मगं ते एखादे युझर इनपुट असेल अथवा फक्त स्पेसबार असेल. किबोर्ड कडून कि-प्रेस पर्यंत console वर असलेला कर्सर तुमच्या किप्रेस ची वाट पहात असेल. डॉस बेस्ड TC compiler वर काम करतांना सुरवातीला हे फंक्शन वापरावेच लागते कारण output पहाण्यासाठी कंन्सोल window थोपवुन ठेवण्याचे काम getch कडुन पार पाडले जाते. पण या फंक्शनचे अनेक उपयोग नंतर करता येतात. 



आता या प्रोग्रॅम मध्ये स्पेशल पद्धतीने जो लुप लिहीला आहे त्या मध्ये scanf function हे कॅरेक्टर input घेत आहे. जर तुम्हाला अजून एक नंबर भरायचा असेल तर y enter करायचा व या ठिकाणीच थांबायचे असेल व प्रोग्रॅम मधून बाहेर पडायचे असेल तर n enter करायचा अशा प्रकारची व्यवस्था या ठिकाणी केली आहे. scanf function हे एक कॅरेक्टर (y अथवा n) भरल्यानंतर enter key मारायला लागते. 

अशा प्रकारच्या situation मध्ये तुम्ही scanf function च्या ऐवजी ch = getch() असे स्टेटमेंट जर लिहीले तर युझर ने एंटर केलेले कॅरेक्टर (y अथवा n) getch function कडून immediately accept होइल व त्याच क्षणी ch या व्हेअरेबल ला assign करण्याचे काम करेल. या ठिकाणी getch function च्या वापरांने तुमचे दोन फायदे होतील. एक म्हणजे जे कॅरेक्टर (y अथवा n) भरले आहे ते तुम्हाला दिसणार नाही व ते दिसायची गरज सुद्धा नाही. दुसरा फायदा म्हणजे तुम्हाला enter key प्रेस करण्याची गरज भासत नाही. 
getch या फंक्शनचा prototype जर पाहीला तर तो char getch(void) असा आहे. त्यामुळे getch फंक्शन हे किबोर्ड कडूण accept केलेले character आहे तसे return करण्याचे काम करते. नेमकी हीच सुविधा वापरून हे रिटर्न केलेले कॅरेक्टर आपण ch या कॅरेक्टर व्हेअरेबल मध्ये collect करतो. 

कधी-कधी प्रोग्रॅमचे आउटपुट अर्धी अथवा जवळपास पुर्ण स्क्रीन भरेल असे असते. हे आउटपुट लुपच्या प्रत्येक iteration मध्ये मिळते. अशावेळी पुढील iteration चे आउटपुट स्वतंत्रपणे दिसण्यासाठी सुद्धा तुम्ही clear screen व getch फंक्शनची जोडी loop मध्ये वापरू शकता. 

अर्थात अशा प्रकारचे उपयोग प्रोग्रॅम करतांना कळतात. पुस्तकात असे reference शक्यतो आढळत नाहीत.   

अर्थात ही पोस्ट जे विद्यार्थी DOS based TC compiler वापरतात त्यांच्यासाठीच उपयोगी आहे. Linux अथवा Unix systems वर अशा प्रकारचे फंक्शन आस्तितवात नाही कारण conio.h ही header file अन्य कोणत्याही OS वर त्याचा समावेश नाही. खरं तर conio.h हि header file मुळच्या C च्या compiler library मध्ये नव्हती. Borland International ने TC compiler launch करतांना conio.h चा समावेश केला. पण या फाइल ला standard म्हणून कधी मिळालेच नाही...!

Linux, Unix  अथवा Windows based compiler मध्ये program चे output बघण्यासाठी getch सारख्या फंक्शनची व्यवस्था करण्याची गरज सुद्धा नसते. कारण output window होल्ड करण्याची in-built सुविधा या सर्वांमध्ये आहे. अन्य ठिकाणी कॅरेक्टर input करण्यासाठी मात्र त्या कंपायलर मधील अन्य सुविधा तपासण्याशिवाय तुम्हाला गत्यंतर नाही हे लक्षात असु द्या...!

Linux/Unix मध्ये curses व ncurses अशा काही लायब्ररी उपलब्ध आहेत ज्यामध्ये डोकावुन तुम्हाला नेमके काय हवे तसे फंक्शन वापरावे लागेल...! 


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... 




Do you like the C Marathi e-learning concept?