दिलचस्प पोस्ट
फ़ोनबुक से हमारे एप्लिकेशन पर संपर्क कैसे आयात करें एक असंबंधित इंटरफ़ेस के लिए कास्टिंग करते समय यह क्यों संकलन करता है? "संदर्भ" पंक्ति सहित सभी डुप्लिकेट पंक्तियों को निकालें jQuery ऑब्जेक्ट: कैश करने के लिए या नहीं कैश करने के लिए? त्रुटि: एंड्रॉइड एसडीके के भीतर ग्रेडल रैपर नहीं मिल सका आपके एंड्रॉइड एसडीके को अपडेट करने की आवश्यकता हो सकती है लूप के भीतर रिक्त परिवर्तन के प्रकार का मूल्य क्यों है? जीएनयू / लिनक्स पर एक सबवर्जन (एसवीएन) सर्वर कैसे सेट करें – उबंटू जावा में अनाग्राम एल्गोरिथ्म एंड्रॉइड: बिटमैप रीसायकल () यह कैसे काम करता है? एक छवि सी # का आकार बदलें Bash: grep को "कच्चे" स्ट्रिंग पास करने का आसान तरीका? एकीकृत खिड़कियों प्रमाणीकरण का उपयोग कर लॉगिन प्राप्ति प्राप्त करना ओटीएफ या टीटीएफ फ़ाइल से मैं फ़ॉन्ट का नाम कैसे प्राप्त करूं? क्या ऐप्पल एसआईआरआई के लिए एपीआई प्रदान करता है? एक पृष्ठ पर सभी AJAX अनुरोधों के लिए "हुक" जोड़ें

Scanf के नुकसान

मैं scanf() के नुकसान जानना चाहता हूँ

कई साइटों में, मैंने पढ़ा है कि scanf का उपयोग बफर ओवरफ्लो हो सकता है इसका कारण क्या है? क्या scanf साथ कोई अन्य कमियां हैं?

Solutions Collecting From Web of "Scanf के नुकसान"

स्कैनएफ के साथ समस्याएं (कम से कम) हैं:

  • उपयोगकर्ता से स्ट्रिंग पाने के लिए %s का प्रयोग करके, यह संभावना है कि स्ट्रिंग आपके बफ़र से अधिक हो सकती है, जिसके कारण ओवरफ़्लो हो सकता है।
  • आपके फ़ाइल सूचक को एक अनिश्चित स्थान में छोड़ने में असफल स्कैन की संभावना है।

मैं पूरी तरह से पूरी लाइनों को पढ़ने के लिए fgets का उपयोग करना पसंद करता हूं ताकि आप पढ़े गए डेटा की मात्रा को सीमित कर सकें। यदि आपके पास एक 1K बफर मिला है, और आप इसे में fgets साथ एक पंक्ति पढ़ते हैं, तो आप बता सकते हैं कि रेखा इस तथ्य से बहुत लंबी है कि कोई नयालाइन वर्ण (एक नई पंक्ति के बिना फ़ाइल की अंतिम पंक्ति के बावजूद) समाप्त नहीं हो रही है।

उसके बाद आप उपयोगकर्ता से शिकायत कर सकते हैं, या शेष रेखा के लिए अधिक स्थान आवंटित कर सकते हैं (यदि आपके पास पर्याप्त जगह नहीं है तब तक लगातार) या तो मामले में, बफर अतिप्रवाह का कोई खतरा नहीं है

एक बार जब आप लाइन को पढ़ते हैं, तो आप जानते हैं कि आप अगली पंक्ति में तैनात हैं, इसलिए वहां कोई समस्या नहीं है फिर आप अपने स्ट्रिंग को अपने दिल की सामग्री में sscanf कर सकते हैं बिना फाइल रीडर पढ़ने और पुनर्स्थापित करने के लिए।

यहां कोड का एक स्निपेट है जिसे मैं सूचना के लिए उपयोगकर्ता से पूछते समय कोई बफ़र अतिप्रवाह सुनिश्चित करने के लिए बार-बार उपयोग करता हूं

यह आसानी से मानक इनपुट के अलावा अन्य फ़ाइल का उपयोग करने के लिए समायोजित किया जा सकता है यदि आवश्यक हो और आप इसे अपने बफर को आवंटित कर सकते हैं (और यह तब तक बढ़ाते रहें जब तक कि यह बड़ा न हो) कॉल करने वाले को वापस देने से पहले (हालांकि कॉलर तब जिम्मेदार होगा इसे मुक्त करने के लिए, बिल्कुल)

 #include <stdio.h> #include <string.h> #define OK 0 #define NO_INPUT 1 #define TOO_LONG 2 static int getLine (char *prmpt, char *buff, size_t sz) { int ch, extra; // Get line with buffer overrun protection. if (prmpt != NULL) { printf ("%s", prmpt); fflush (stdout); } if (fgets (buff, sz, stdin) == NULL) return NO_INPUT; // If it was too long, there'll be no newline. In that case, we flush // to end of line so that excess doesn't affect the next call. if (buff[strlen(buff)-1] != '\n') { extra = 0; while (((ch = getchar()) != '\n') && (ch != EOF)) extra = 1; return (extra == 1) ? TOO_LONG : OK; } // Otherwise remove newline and give string back to caller. buff[strlen(buff)-1] = '\0'; return OK; } 

 // Test program for getLine(). int main (void) { int rc; char buff[10]; rc = getLine ("Enter string> ", buff, sizeof(buff)); if (rc == NO_INPUT) { // Extra NL since my system doesn't output that on EOF. printf ("\nNo input\n"); return 1; } if (rc == TOO_LONG) { printf ("Input too long [%s]\n", buff); return 1; } printf ("OK [%s]\n", buff); return 0; } 

एक परीक्षण चलाने:

 $ ./tstprg Enter string>[CTRL-D] No input $ ./tstprg Enter string> a OK [a] $ ./tstprg Enter string> hello OK [hello] $ ./tstprg Enter string> hello there Input too long [hello the] $ ./tstprg Enter string> i am pax OK [i am pax] 

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

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

scanf साथ असली समस्या पूरी तरह से अलग प्रकृति है, भले ही यह अतिप्रवाह के बारे में भी हो। जब scanf फ़ंक्शन का उपयोग अंकगणित प्रकार के मानों में अंकों के दशमलव प्रस्तुतियों को परिवर्तित करने के लिए किया जाता है, तो यह अंकगणित अतिप्रवाह से कोई सुरक्षा प्रदान नहीं करता है। यदि अतिप्रवाह होता है, तो scanf अनिर्धारित व्यवहार उत्पन्न करता है। इस कारण से, सी मानक पुस्तकालय में रूपांतरण करने का एकमात्र उचित तरीका strto... से परिवार strto... परिवार है

इसलिए, ऊपर संक्षेप में प्रस्तुत करने के लिए, scanf साथ समस्या यह है कि स्ट्रिंग बफ़र्स के साथ ठीक से और सुरक्षित रूप से उपयोग करने के लिए मुश्किल (यद्यपि संभव) है और अंकगणित इनपुट के लिए सुरक्षित रूप से उपयोग करना असंभव है उत्तरार्द्ध वास्तविक समस्या है पूर्व सिर्फ एक असुविधा है

पीएस उपरोक्त में scanf फ़ंक्शन के पूरे परिवार ( fscanf और sscanf सहित) के बारे में होने का इरादा है। विशेष रूप से scanf साथ, स्पष्ट मुद्दा यह है कि संभावित रूप से इंटरैक्टिव इनपुट पढ़ने के लिए कड़ाई से स्वरूपित फ़ंक्शन का उपयोग करने का विचार बल्कि संदिग्ध है।

Comp.lang.c से पूछे जाने वाले प्रश्न: हर कोई क्यों नहीं scanf का प्रयोग नहीं करता है? इसके बजाय मुझे क्या करना चाहिए?

scanf में कई समस्याएं हैं – प्रश्न 12.17 , 12.18 ए , और 12.19 देखें । साथ ही, इसके %s प्रारूप में ऐसी समस्या है जो gets() हो सकती है (प्रश्न 12.23 देखें) -यह गारंटी देने के लिए मुश्किल है कि प्राप्तकर्ता बफर अतिप्रवाह नहीं होगा [पाद लेख]

अधिक सामान्यतः, scanf को अपेक्षाकृत संरचित, स्वरूपित इनपुट के लिए डिज़ाइन किया गया है (इसका नाम वास्तव में "स्वरूपित स्कैन" से प्राप्त होता है)। यदि आप ध्यान देते हैं, तो यह आपको बताएगा कि क्या यह सफल या असफल है, लेकिन यह आपको केवल लगभग बता सकता है कि यह कहां विफल हो गया है, और बिल्कुल नहीं या क्यों आपके पास कोई त्रुटि वसूली करने का बहुत कम मौका है

फिर भी इंटरैक्टिव उपयोगकर्ता इनपुट कम से कम संरचित इनपुट है। एक अच्छी तरह से डिज़ाइन किया गया उपयोगकर्ता इंटरफ़ेस उपयोगकर्ता की संभावना के बारे में कुछ भी लिखने की संभावना के लिए अनुमति देता है, न केवल अक्षरों या विराम चिह्न, जब अंकों की अपेक्षा की जाती थी, लेकिन इससे भी अधिक या कम वर्ण अपेक्षित थे, या कोई भी अक्षर नहीं था ( यानी , केवल रिटर्न कुंजी), या समयपूर्व EOF, या कुछ भी। scanf का उपयोग करते समय इन सभी संभावित समस्याओं से scanf सौदा करना लगभग असंभव है; पूरी लाइनें पढ़ने के लिए आसान ( fgets या पसंद के साथ), तो उन्हें व्याख्या, या तो sscanf या कुछ अन्य तकनीक का उपयोग कर ( strtok , strtok , और atoi जैसे कार्य अक्सर उपयोगी होते हैं, प्रश्न 12.16 और 13.6 भी देखें।) यदि आप किसी भी scanf संस्करण का उपयोग करते हैं, तो सुनिश्चित करें कि आइटम की अपेक्षित संख्या पाए गए हैं, यह सुनिश्चित करने के लिए वापसी मान की जांच करना सुनिश्चित करें। इसके अलावा, यदि आप %s उपयोग करते हैं, तो बफर ओवरफ्लो से बचाव सुनिश्चित करें।

ध्यान दें, वैसे, scanf आलोचना fscanf और sscanf अभियोग के लिए आवश्यक नहीं हैं scanf stdin से पढ़ता है, जो आम तौर पर एक इंटरैक्टिव कीबोर्ड होता है और इसलिए कम से कम विवश है, जिससे सबसे अधिक समस्याएं हो सकती हैं। जब किसी डेटा फ़ाइल का ज्ञात प्रारूप होता है, दूसरी ओर, यह fscanf साथ पढ़ने के लिए उपयुक्त हो सकता है यह sscanf (जब तक कि वापसी मान की जाँच की जाती है) के साथ स्ट्रिंग को पार्स करने के लिए बिल्कुल उपयुक्त है, क्योंकि यह नियंत्रण हासिल करने में आसान है, स्कैन को पुनरारंभ करें, इनपुट को त्यागें, अगर वह मेल नहीं खाता, आदि।

अतिरिक्त लिंक:

  • क्रिस टोरेक द्वारा लंबी व्याख्या
  • आपके द्वारा अब तक स्पष्टीकरण सचमुच

संदर्भ: के एंड आर 2 सेक। 7.4 पी 159

हाँ आप सही है। scanf परिवार में scanf परिवार ( scanf , sscanf , fscanf .. एटीसी) में प्रमुख सुरक्षा दोष है, क्योंकि वे बफर की लंबाई (जिसमें वे पढ़ रहे हैं) खाते में नहीं लेते हैं।

उदाहरण:

 char buf[3]; sscanf("abcdef","%s",buf); 

स्पष्ट रूप से बफर buf मैक्स 3 चार को पकड़ सकता है लेकिन sscanf बफर अतिप्रवाह होने के कारण "abcdef" डालकर कोशिश करेगा।

scanf को जो चीज आप चाहते हैं उसे करने के लिए बहुत मुश्किल है ज़रूर, आप कर सकते हैं, लेकिन scanf("%s", buf); जैसी चीजें scanf("%s", buf); के रूप में खतरनाक gets(buf); , जैसा कि सभी ने कहा है

एक उदाहरण के रूप में, पक्सदीपोल अपने कार्य में क्या पढ़ रहा है, जैसे कुछ के साथ किया जा सकता है:

 scanf("%10[^\n]%*[^\n]", buf)); getchar(); 

उपरोक्त एक पंक्ति पढ़ी जाएगी, बफ़ में पहले 10 गैर-नए अक्षरों को संग्रहीत करेगा, और फिर एक नई लाइन (और इसमें शामिल) तक सब कुछ त्याग दें इसलिए, पेंक्सीडालो के कार्य को scanf के माध्यम से निम्नलिखित तरीके से लिखा जा सकता है:

 #include <stdio.h> enum read_status { OK, NO_INPUT, TOO_LONG }; static int get_line(const char *prompt, char *buf, size_t sz) { char fmt[40]; int i; int nscanned; printf("%s", prompt); fflush(stdout); sprintf(fmt, "%%%zu[^\n]%%*[^\n]%%n", sz-1); /* read at most sz-1 characters on, discarding the rest */ i = scanf(fmt, buf, &nscanned); if (i > 0) { getchar(); if (nscanned >= sz) { return TOO_LONG; } else { return OK; } } else { return NO_INPUT; } } int main(void) { char buf[10+1]; int rc; while ((rc = get_line("Enter string> ", buf, sizeof buf)) != NO_INPUT) { if (rc == TOO_LONG) { printf("Input too long: "); } printf("->%s<-\n", buf); } return 0; } 

scanf साथ अन्य एक समस्या अतिप्रवाह के मामले में उसका व्यवहार है। उदाहरण के लिए, जब कोई int पढ़ते हैं:

 int i; scanf("%d", &i); 

ओवरफ्लो के मामले में उपरोक्त सुरक्षित रूप से उपयोग नहीं किया जा सकता है पहले मामले के लिए, scanf बजाय fgets साथ स्ट्रिंग पढ़ना अधिक सरल है

*scanf() परिवार के साथ मेरी समस्याएं:

  • % S और% के साथ बफर अतिप्रवाह के लिए संभावित [रूपांतरण विनिर्देशक हां, आप अधिकतम फ़ील्ड चौड़ाई निर्दिष्ट कर सकते हैं, लेकिन printf() विपरीत नहीं, आप scanf() कॉल में इसे तर्क नहीं बना सकते हैं; यह रूपांतरण विनिर्देशक में कठोर होना चाहिए।
  • % D,% i, आदि के साथ अंकगणित अतिप्रवाह के लिए संभावित
  • बुरी तरह से निर्मित इनपुट का पता लगाने और अस्वीकार करने की सीमित क्षमता। उदाहरण के लिए, "12w4" मान्य पूर्णांक नहीं है, लेकिन scanf("%d", &value); सफलतापूर्वक कन्वर्ट और value लिए 12 आवंटित, छोड़ने के लिए "w4" इनपुट स्ट्रीम में फंसने के लिए एक भावी पढ़ने में गलत आदर्श रूप से पूरे इनपुट स्ट्रिंग को अस्वीकार कर दिया जाना चाहिए, लेकिन scanf() आपको ऐसा करने के लिए एक आसान तंत्र नहीं देता।

यदि आप जानते हैं कि आपका इनपुट हमेशा तय-लम्बाई स्ट्रिंग्स और संख्यात्मक मानों के साथ अच्छी तरह से बनता जा रहा है जो ओवरफ्लो के साथ इश्कबाज नहीं होते हैं, तो scanf() एक महान टूल है। यदि आप इंटरेक्टिव इनपुट या इनपुट के साथ काम कर रहे हैं जो कि अच्छी तरह से बनने की गारंटी नहीं है, तो कुछ और का उपयोग करें

scanf -जैसी फ़ंक्शन के साथ एक बड़ी समस्या है – किसी भी प्रकार की सुरक्षा की कमी। यही है, आप यह कोड कर सकते हैं:

 int i; scanf("%10s", &i); 

नरक, यह भी "ठीक" है:

 scanf("%10s", i); 

यह printf जैसे प्रकार्य कार्यों से भी बदतर है, क्योंकि scanf एक सूचक की अपेक्षा करता है, इसलिए क्रैश अधिक होने की संभावना है।

बेशक, वहाँ कुछ प्रारूप विनिर्देशक चेकर्स हैं, लेकिन, ये सही और ठीक नहीं हैं, वे भाषा या मानक पुस्तकालय का हिस्सा नहीं हैं।

यहां कई उत्तर scanf("%s", buf) का उपयोग करने के संभावित अतिप्रवाह मुद्दों पर चर्चा करते हैं, लेकिन नवीनतम पॉसिक्स विनिर्देश अधिक या कम एक m असाइनमेंट-आवंटन वर्ण प्रदान करके इस समस्या को हल करता है जिसका उपयोग c लिए प्रारूप विनिर्देशकों में किया जा सकता है , s , और [ प्रारूपों] यह scanf को अधिक स्मृति के रूप में आवश्यक आवंटित करने की अनुमति देगा, ताकि scanf साथ आवश्यक हो (इसलिए इसे बाद में free मुक्त किया जाना चाहिए)।

इसका उपयोग का एक उदाहरण:

 char *buf; scanf("%ms", &buf); // with 'm', scanf expects a pointer to pointer to char. // use buf free(buf); 

यहां देखें इस दृष्टिकोण के नुकसान यह है कि यह POSIX विनिर्देशन के लिए एक अपेक्षाकृत हालिया अतिरिक्त है और यह सी विनिर्देशन में बिल्कुल भी निर्दिष्ट नहीं है, इसलिए यह अभी के लिए अनजान रहता है।

scanf का लाभ एक बार आप सीखते हैं कि टूल का उपयोग कैसे करें, जैसा कि आप हमेशा सी में करते हैं, इसमें बेहद उपयोगी उपयोग केसेस हैं। मैन्युअल पढ़ने और समझने के द्वारा आप scanf और दोस्तों का उपयोग कैसे कर सकते हैं। यदि आप गंभीर समझने वाले मुद्दों के बिना उस मैनुअल के माध्यम से नहीं प्राप्त कर सकते हैं, तो शायद यह संकेत देगा कि आपको सी बहुत अच्छी तरह से नहीं पता है।


scanf और दोस्तों को दुर्भाग्यपूर्ण डिज़ाइन विकल्पों से सामना करना पड़ा , जिन्होंने दस्तावेजों को पढ़ने के बिना सही तरीके से उपयोग करने के लिए मुश्किल (और कभी-कभी असंभव) प्रदान किया, जैसा कि अन्य उत्तर दिखाए गए हैं। यह सी के दौरान होता है, दुर्भाग्य से, इसलिए यदि मैं scanf का उपयोग करने के लिए सलाह देना चाहता हूं तो शायद मैं सी का उपयोग करने के बारे में सलाह scanf

सबसे बड़ा नुकसान में से एक को विशुद्ध रूप से लगता है कि वह प्रतिष्ठा के बीच अर्जित हुई प्रतिष्ठा है ; सी के कई उपयोगी विशेषताओं के साथ हमें इसे इस्तेमाल करने से पहले अच्छी तरह से सूचित किया जाना चाहिए। कुंजी को यह महसूस करना है कि सी के बाकी हिस्सों के साथ, यह सूक्ष्म और मुहावरेदार लगता है, लेकिन यह आसानी से गुमराह करने वाला हो सकता है। यह सी में व्यापक है; शुरुआती लोगों के लिए यह कोड लिखना आसान है, जो उन्हें लगता है कि समझ में आता है और शुरू में उनके लिए भी काम कर सकता है, लेकिन समझ में नहीं आता है और विनाशकारी रूप से विफल हो सकता है

उदाहरण के लिए, सामान्यतः अपेक्षा की जाती है कि %s प्रतिनिधि एक पंक्ति को पढ़ने के लिए पैदा करेगा, और जबकि यह सहज ज्ञान युक्त लग सकता है, यह जरूरी नहीं कि सच हो। एक शब्द के रूप में पढ़े जाने वाले फ़ील्ड का वर्णन करना अधिक उपयुक्त है। मैनुअल पढ़ना हर कार्य के लिए जोरदार सलाह दी जाती है

इस प्रश्न का कोई जवाब क्या बिना सुरक्षा के अभाव और बफर अतिप्रवाह के जोखिम का उल्लेख किए बिना होगा? जैसा कि हमने पहले से ही कवर किया है, सी एक सुरक्षित भाषा नहीं है, और हमें कोनों में कटौती करने की इजाजत दी जाएगी, संभवतः शुद्धता की कीमत पर अनुकूलन लागू करने के लिए या अधिक संभावना है क्योंकि हम आलसी प्रोग्रामर हैं। इस प्रकार, जब हम जानते हैं कि सिस्टम किसी निश्चित संख्या के बाइट्स की तुलना में बड़ी स्ट्रिंग प्राप्त नहीं करेगा, तो हमें एक सरणी को घोषित करने की क्षमता दी गई है जो आकार और आगे निकलना सीमा जांच कर रहा है। मैं वास्तव में इसे नीचे-गिरावट के रूप में नहीं देखता हूं; यह एक विकल्प है दोबारा, मैनुअल पढ़ने के लिए जोरदार सलाह दी गई है और यह विकल्प हमें बताएगा

आलसी प्रोग्रामर केवल स्कैनएफ द्वारा scanf वाले नहीं हैं उदाहरण के लिए लोगों को %d का उपयोग करके float या double मूल्यों को पढ़ने का प्रयास करने के लिए असामान्य नहीं है। वे आम तौर पर यह विश्वास करते हुए गलत होते हैं कि कार्यान्वयन, पर्दे के पीछे किसी प्रकार के रूपांतरण का प्रदर्शन करेगा, जो कि समझ में आता है क्योंकि इसी तरह के रूपांतरण पूरे भाषा में होते हैं, लेकिन यह मामला यहां नहीं है। जैसा कि मैंने पहले कहा था, scanf और दोस्तों (और वास्तव में सी के बाकी) भ्रामक हैं; वे सूक्ष्म और मुहावरे हैं लेकिन वे नहीं हैं

अनियंत्रित प्रोग्रामर को ऑपरेशन की सफलता पर विचार करने के लिए मजबूर नहीं किया गया है । मान लीजिए उपयोगकर्ता कुछ पूरी तरह से नॉन-न्यूमेरिक में प्रवेश करता है जब हमने scanf को %d का उपयोग करते हुए दशमलव अंकों के अनुक्रम को पढ़ने और परिवर्तित करने के लिए कहा है। एक ही तरह से हम इस तरह के गलत डेटा को अवरुद्ध कर सकते हैं, वापसी मूल्य की जांच करना, और कितनी बार हम वापसी मूल्य की जांच करना परेशान करते हैं?

बहुत ही fgets तरह, जब scanf और दोस्तों को पढ़ने के लिए कहा गया है कि वे क्या पढ़ा नहीं है, धारा एक असामान्य स्थिति में छोड़ दिया जाएगा;fgets के मामले में, अगर पूरी लाइन को संग्रहीत करने के लिए पर्याप्त स्थान नहीं है, तो रेखा के शेष अपूर्ण न किए गए ग़लती से गलत तरीके से इलाज किए जा सकते हैं, यद्यपि यह एक नई रेखा है, जब यह नहीं है। – scanf और दोस्तों के मामले में, उपरोक्त दस्तावेज के रूप में एक रूपांतरण विफल हो गया, गलत डेटा स्ट्रीम पर अपठित छोड़ दिया गया है और इसे ग़लत ढंग से माना जा सकता है जैसे कि यह एक अलग क्षेत्र का हिस्सा है

scanf का उपयोग करने के बजाय scanf और दोस्तों का उपयोग करना आसान नहीं है अगर हम '\n' खोज करते हुए सफलता की जांच करते हैं, या जब हम scanf और दोस्तों का उपयोग करते हैं तो हम fgets का उपयोग कर रहे हैं या हम रिटर्न वैल्यू का निरीक्षण कर रहे हैं, और हम पाते हैं कि हमने fgets का fgets करते हुए एक अपूर्ण लाइन पढ़ी है या पढ़ने में विफल scanf का उपयोग कर क्षेत्र, तो हम एक ही वास्तविकता का सामना कर रहे हैं: हम इनपुट को छोड़ने की संभावना (आमतौर पर ऊपर तक और अगली नई रेखा सहित) की संभावना है! Yuuuuuuck!

दुर्भाग्य से, scanf दोनों इस तरह से इनपुट को त्यागने के लिए एक साथ (कठिन-सहज) और आसान (कम से कम कीस्ट्रोक्स) बनाता है। उपयोगकर्ता इनपुट को छोड़ने की इस वास्तविकता का सामना करना पड़ा, कुछ ने scanf("%*[^\n]%*c"); , इस बात का एहसास नहीं है कि %*[^\n] प्रतिनिधि असफल हो जायेगा जब उसे किसी नई लाइन के मुकाबले कुछ भी नहीं सामना करना पड़ेगा, और इसलिए नई लाइन को अभी भी स्ट्रीम पर छोड़ दिया जाएगा।

दो प्रारूप प्रतिनिधियों को अलग करके थोड़ा सा अनुकूलन, और हम यहां कुछ सफलता देखते हैं: scanf("%*[^\n]"); getchar(); scanf("%*[^\n]"); getchar(); । कुछ अन्य उपकरण का उपयोग करते हुए ऐसा कुछ कीस्ट्रोक्स के साथ करने का प्रयास करें;)