आप केवल निम्नलिखित कार्यक्रम चलाने की जरूरत है:
#include <stdio.h>
int main (void) {
char str[20] = {'\0'};
int count, num = 42;
count = sscanf ("hello/17", "%s/%d", str, &num);
printf ("String was '%s'\n", str);
printf ("Number was %d\n", num);
printf ("Count was %d\n", count);
return 0;
}
को देखें कि यह क्यों हो रहा है। उत्पादन होता है:
String was 'hello/17'
Number was 42
Count was 1
कारण %s
फॉर्मेट स्पेसिफायर से कोई लेना देना नहीं है।
s
: C99 7.19.6.2 The fscanf function
(सी 11 में बड़े पैमाने पर अपरिवर्तित, और इटैलिक मेरे हैं) से गैर सफेद-अंतरिक्ष वर्णों का एक क्रम से मेल खाता है।
/
के बाद से सफेद स्थान है, यह, स्ट्रिंग बिट में शामिल हो जाता है इसी कारण 17
करता है के रूप में नहीं है। यह भी इस तथ्य से संकेत मिलता है कि sscanf
1
देता है, जिसका अर्थ है कि केवल एक आइटम स्कैन किया गया था।
आप जो खोज रहे हैं वह कुछ ऐसा है जो अन्य/
स्ट्रिंग (सफेद स्थान सहित) में स्कैन करता है। मानक के एक ही अनुभाग वहाँ रूप में अच्छी तरह से बाहर में मदद करता है:
[
: उम्मीद वर्ण (scanset) का एक सेट से पात्रों में से एक अरिक्त अनुक्रम से मेल खाता है। रूपांतरण विनिर्देशक में मिलान स्ट्रिंग में सभी अनुवर्ती वर्ण शामिल हैं, मिलान करने वाले दाएं ब्रैकेट (]) तक। ब्रैकेट्स (स्कैनलिस्ट) के बीच के वर्ण स्कैनसेट लिखते हैं, जब तक कि बाएं ब्रैकेट के बाद वर्ण एक circumflex (^) नहीं है, इस स्थिति में स्कैनसेट में सभी वर्ण होते हैं जो circumflex और दाएं ब्रैकेट के बीच स्कैनलिस्ट में दिखाई नहीं देते हैं।
दूसरे शब्दों में, कुछ की तरह:
#include <stdio.h>
int main (void) {
char str[20] = {'\0'};
int count, num = 42;
count = sscanf ("hello/17", "%[^/]/%d", str, &num);
printf ("String was '%s'\n", str);
printf ("Number was %d\n", num);
printf ("Count was %d\n", count);
return 0;
}
जो आप देता है: एक असीम %s
के साथ कभी नहीं कभी उपयोग scanf
:
String was 'hello'
Number was 17
Count was 2
एक सलाह के अन्य टुकड़ा , आप एक बफर ओवरफ्लो हमले के लिए पूछ रहे हैं। यदि आप एक मजबूत उपयोगकर्ता इनपुट फ़ंक्शन चाहते हैं, तो this answer देखें।
एक बार जब आप इसे स्ट्रिंग के रूप में रखते हैं, तो आप बफर ओवरफ़्लो (क्योंकि आपने इनपुट पर आकार सीमित कर दिया है) के बारे में चिंता किए बिना sscanf
इसे अपने दिल की सामग्री पर कर सकते हैं।
दिलचस्प सवाल। 'स्कैनफ़'' में केवल '% s' से अधिक मिलान अनुकरण करने के लिए कुछ हो सकता है। – Eregrith