Friday, April 24, 2009

सीखिए सी -15 : scanf()

पिछले अध्याय में हमने देखा कि printf() की सहायता से हम किस प्रकार कंप्यूटर की स्मृति में से आंकड़े लाकर स्क्रीन पर प्रदर्शित कर सकते हैं। कई बार इसका उल्टा भी आवश्यक होता है, यानी कुंजीपटल पर अंकित सूचनाओं को कंप्यूटर की स्म़ृति में डालना। इस काम में printf() का भाई scanf() नामक फलनक हमारी मदद करता है। scanf() भी stdio.h संग्रह का फलनक है। आइए, उससे परिचय बढ़ाते हैं। निम्नलिखित प्रोग्राम को देखिए।

---------------------
प्रोग्राम 5

/* scanf() ka udaharan */

#include <stdio.h>

void main()
{
char aapki_pasand;
printf("Aapki pasand ka koi akshar enter kijiye:\n");
scanf("%c", &aapki_pasand);
printf("Aapne %c akshar enter kiya.\n", aapki_pasand);
}
---------------------
आउटपुट
Aapki pasand ka koi akshar enter kijiye: a
Aapne a akhsar enter kiya.
---------------------

इस प्रोग्राम में aapki_pasand नामक वर्ण राशि (char) घोषित की गई है, लेकिन उसे कोई मान नहीं दिया गया है। इसके बाद वाली उक्ति आपके लिए परिचित है, वह स्क्रीन पर Aapki pasand ka koi akshar enter kijiye: संदेश प्रदर्शित करता है। इस संदेश को प्रदर्शित करने के बाद नियंत्रण प्रचालन तंत्र, यानी डोस, को नहीं लौट जाता, जैसा कि अब तक के प्रोग्रामों में होता आया है, पर कर्सर विसर्ग चिह्न (:) के आगे रुक जाता है। यह इसलिए क्योंकि अगली उक्ति scanf() है, जो कुंजीपटल पर अंकित संकेतों को स्वीकारता है।

अब आप कुंजीपटल पर a वाली कुंजी दबाइए और उसके बाद ऐंटर कुंजी को। तुरंत ही आपको स्क्रीन पर यह वाक्य दिखाई देगा: Aapne a akshar enter kiya.

क्या यह जादू जैसा नहीं लगता? आपके प्रोग्राम को कैसे पता चला कि आपने कौन-सा अक्षर ऐंटर किया था? दरअसल यह सब scanf() का कमाल है।

scanf() का हुलिया printf() से बहुत मिलता-जुलता है, पर कुछ-कुछ भिन्न भी है। printf() के ही समान इसमें भी गोल कोष्ठकों के बीच एक उक्ति है, जो दुहरे उद्धरण चिह्नों से घिरी है।

इस उक्ति में वही प्रतिशत-चिह्न वाला संयुक्त वर्ण %c है जो आंकड़े का प्रकार दर्शाता है (इस उदाहरण में char)। उद्धरण चिह्नों के बाद printf() के ही समान यहां भी अल्प विराम चिह्न (,) है। उसके बाद चर राशि का नाम है, पर चर राशि के नाम के पहले और अल्प विराम के बाद आप यहां एक नया चिह्न देख रहे हैं, जो है &। इसे ऐंपरसैंड कहते हैं। आइए, इसके बारे में जानें।

कंप्यूटर ने apni_pasand नामक वर्ण राशि के लिए 8 बिट का स्थान आरक्षित करके उस स्थान के पते को apni_pasand नाम के साथ जोड़ दिया है। पर चूंकि हमने इस आरक्षित स्थान पर कोई मान नहीं रखा है, इसलिए वह जगह उपयोगी आंकड़े से भरी नहीं है। उस जगह पर a अक्षर को रखने के लिए हम scanf() का आह्वान करते हैं और उसे %c चिह्न द्वारा सूचित करते हैं कि हम कंप्यूटर की स्मृति में एक वर्ण को रखना चाहते हैं। अब scanf() के लिए यह जानना जरूरी है कि इस वर्ण राशि को कहां रखे। हम a को apni_pasand नामक चर राशि के लिए आरक्षित स्मृति-कोषों में रखना चाहते हैं। scanf() को इन कोषों का पता बताने के लिए इन कोषों से संबंधित राशि के नाम के पहले & चिह्न जोड़ा जाता है। किसी चर राशि के नाम के पहले & चिह्न जोड़ने से उस चर राशि के लिए आरक्षित स्मृति कोषों का पता प्राप्त होता है।

इसीलिए & को एड्रेस प्रचालक, यानी पता बतानेवाला प्रचालक, कहा जाता है।

हमारे प्रोग्राम में scanf() को &apni_pasand से apni_pasand के स्मृति-कोषों का पता मिल जाता है और वह a अक्षर को इन कोषों में रख देता है।

प्रोग्राम की अगली उक्ति का परिणाम यह सिद्ध कर देता है कि scanf() ने सचमुच ऐसा किया है क्योंकि आउटपुट में हमें %c के स्थान पर a अक्षर दिखाई देता है।

printf() के ही समान scanf() भी एक से अधिक चर राशियों को स्वीकार कर सकता है। देखिए कैसे:

-------------------------
प्रोग्राम-6

/* scanf() ek sath do rashiyon ko bhi pad sakta hai. */

#include <stdio.h>

void main()
{
char pahala_akshar;
char doosara_akshar;
printf("Apni pasand ke do akshar enter kijiye. Dono aksharon ke beech rikta sthan rakhiye: \n");
scanf("%c%c", &pahala_akshar, &doosara_akshar);
printf("Aapki pahli pasand hai %c aur doosari %c.\n", pahala_akshar,
doosara_akshar);
}
------------------------

आउटपुट:
Apni pasand ke do akshar enter kijiye. Donon aksharon ke beech rikta
sthan rakhiye: a b

Aapki pahli pasand hai a aur doosari b.

-------------------------
यहां दो वर्ण राशियां घोषित की गई हैं pahala_akshar और doosara_akshar, और scanf() से इनका मान प्राप्त किया जाता है। कुंजी-पटल द्वारा इन दोनों राशियों का मान (a और b) अंकित कीजिए। दोनों अक्षरों के बीच रिक्त स्थान होना जरूरी है, इसलिए a की कुंजी दबाने के बाद रिक्त-दंड (स्पेस-बार) को दबाइए और उसके बाद b की कुंजी को। इस रिक्त स्थान को देखकर scanf() समझ जाता है कि पहली राशि का मान पूरा हो गया है और कुंजी-पटल अब अगली राशि का मान प्रेषित करेगा। रिक्त-दंड के स्थान पर आप टैब अथवा ऐंटर कुंजी भी दबा सकते हैं। इन तीनों को श्वेत-स्थान देनेवाले वर्ण (वाइट स्पेस कैरक्टर) कहा जाता है, क्योंकि ये स्क्रीन पर या कागज पर दिखाई नहीं देते। अंत में ऐंटर कुंजी दबाइए, जिससे कंप्यूटर को मालूम पड़े कि आपने दोनों अक्षरों को ऐंटर कर दिया है।

scanf() के कोष्ठकों में इस बार दो %c चिह्न हैं और तदनुसार अल्प-विराम (,) के बाद दो राशियों के नाम भी हैं। दोनों राशियों के पहले & चिह्न भी लगा हुआ है।

प्रोग्राम के आउटपुट से हमें पता चलता है कि scanf() ने दोनों राशियों को ठीक प्रकार से स्मृति में पहुंचा दिया है।

इस अध्याय के प्रोग्रामों में हमने scanf() की सहायता से वर्ण राशियों को ही पढ़ा है, लेकिन scanf() अन्य प्रकार की राशियों को भी इतनी ही कुशलता से पढ़ सकता है। केवल उसके कोष्ठकों में दुहरे उद्धरण चिह्नों के बीच %c के स्थान पर अन्य राशियों के सूचक-चिह्न, यानी %d, %l या %f रखने की आवश्यकता है।

अंत में हम scanf() का उपयोग करते समय ध्यान में रखने की एक जरूरी बात फिर से दुहरा देते हैं। scanf() के लिए यह जानना आवश्यक होता है कि वह कुंजीपटल से प्राप्त सूचनाओं को कंप्यूटर की स्मृति में कहां रखे। यह जानकारी उसे उसके कोष्ठकों में मौजूद चर राशि के नाम के पहले & चिह्न जोड़कर दी जाती है। अपने प्रोग्रामों में scanf() का उपयोग करते समय इस & चिह्न की ओर विशेष ध्यान दीजिए, अन्यथा आपको scanf() से वांचित परिणाम नहीं प्राप्त होंगे।

1 comment: