के रूप में अन्य उत्तर NULL
से उल्लेख किया गया है एक अतिरिक्त तर्क के रूप में sscanf
को पारित करने के लिए मान्य नहीं है।
http://www.cplusplus.com/reference/cstdio/sscanf अतिरिक्त तर्कों की कहते हैं:
प्रारूप स्ट्रिंग के आधार पर, समारोह अतिरिक्त तर्कों के एक दृश्य की उम्मीद कर सकते हैं, प्रत्येक जहां निकाले पात्रों में से व्याख्या के साथ संग्रहीत किया जाता है आवंटित भंडारण करने के लिए एक सूचक युक्त उचित प्रकार।
For the %s
specifier these extracted characters are:
गैर-सफ़ेद पात्रों की संख्या कुछ भी पाया पहले खाली स्थान के चरित्र पर रोक। संग्रहीत अनुक्रम के अंत में एक समाप्ति शून्य वर्ण स्वचालित रूप से जोड़ा जाता है।
तो जब "गैर-व्हाइटस्पेस वर्ण" और "निरर्थक शून्य अक्षर" संग्रहीत किया जाता है, तो एक सीगफॉल्ट होगा। कौन वास्तव में क्या दृश्य स्टूडियो निकलेगा (आप परीक्षण कर सकते हैं कि इस http://webcompiler.cloudapp.net/ में विफल रहता है):
अब जहाँ तक गैर दृश्य स्टूडियो compilers, %s
विनिर्देशक के लिए libc के निष्कर्षण कोड: https://github.com/ffainelli/uClibc/blob/master/libc/stdio/_scanf.c#L1376 अग्रणी है टिप्पणी: /* We might have to handle the allocation ourselves */
इस वजह से:
GNU सी पुस्तकालय (एक गैरमानक विस्तार के रूप में) गतिशील आवंटन रूपांतरण विनिर्देशक समर्थित a
चरित्र के माध्यम से। यह सुविधा कम से कम अब तक glibc 2.0 के रूप में मौजूद प्रतीत होती है।
संस्करण 2.7 के बाद से, glibc a
संशोधक के समान उद्देश्य के लिए m
संशोधक भी प्रदान करता है।
[Source]
तो क्योंकि एक बफर के लिए libc अर्क sscanf
को आंतरिक रूप से निर्माण किया गया और बाद में जाँच करता है कि बफर पैरामीटर कोई निशानी नहीं लगाई यह असाइन करने से पहले, यह कभी नहीं एक NULL
बफर पैरामीटर के लिए पात्रों लिखेंगे है।
मैं इतना तनाव नहीं दे सकता कि यह गैर-मानक है, और मामूली लाइब्रेरी अपडेट के बीच भी संरक्षित होने की गारंटी नहीं है। ऐसा करने का एक बेहतर तरीका *
उप विनिर्देशक जो उपयोग करने के लिए है:
इंगित करता है डेटा स्ट्रीम से पढ़ लेकिन ध्यान नहीं दिया जा रहा है कि (यानी यह स्थान एक तर्क से बताया में संग्रहीत नहीं है) ।
[Source]
यह उदाहरण के लिए इस तरह पूरा किया जा सकता:
s == NULL ? sscanf("Privjet mir!", "%*s") : sscanf("Privjet mir!", "%s", s);
जाहिर त्रिगुट का सच शाखा नो-सेशन है, लेकिन मैं इसके साथ शामिल किया है उम्मीद है कि स्ट्रिंग से अन्य डेटा को पढ़ने की उम्मीद है।
यह उत्तर हमें यह भी सिखाता है कि शून्य को मना करने से स्पष्ट रूप से "शून्य" शब्द का उल्लेख करने की आवश्यकता नहीं है।यह बताते हुए कि "कुछ विशिष्ट प्रकार के डेटा> के लिए सूचक" होना चाहिए, निहित रूप से शून्य को रोकता है। – Lii