2012-10-16 15 views
9

इनपुट द्वारा अलग पढ़ने के लिए एक स्ट्रिंग और एक पूर्णांक है, जो इस तरह की एक '/' से अलग होते हैं, होते हैं:scanf का उपयोग कर एक स्ट्रिंग और एक पूर्णांक/

hello/17 

और मैं एक में इनपुट पढ़ना चाहते हैं स्ट्रिंग और एक int, इस तरह:

char str[20]; 
int num; 
scanf("%s/%d", str, &num); // this how I tried to do it. 

मैं इसे किसी भी सलाह बनाने के लिए, नहीं कर पा रहे?

+0

दिलचस्प सवाल। 'स्कैनफ़'' में केवल '% s' से अधिक मिलान अनुकरण करने के लिए कुछ हो सकता है। – Eregrith

उत्तर

13

scanf%s पढ़ने की कोशिश करते समय एक व्हाइटस्पेस समाप्त स्ट्रिंग का इंतजार कर रहा है। मना चरित्र सीधे सेट निर्दिष्ट करने के लिए

प्रयास करें:

scanf("%[^/]/%d", str, &num); 

आप formating कोड के बारे में और अधिक पढ़ सकते here

+1

सावधानीपूर्वक, आपने अपने विस्तृत उत्तर के लिए – Eregrith

7

आप केवल निम्नलिखित कार्यक्रम चलाने की जरूरत है:

#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 करता है के रूप में नहीं है। यह भी इस तथ्य से संकेत मिलता है कि sscanf1 देता है, जिसका अर्थ है कि केवल एक आइटम स्कैन किया गया था।

आप जो खोज रहे हैं वह कुछ ऐसा है जो अन्य/ स्ट्रिंग (सफेद स्थान सहित) में स्कैन करता है। मानक के एक ही अनुभाग वहाँ रूप में अच्छी तरह से बाहर में मदद करता है:

[: उम्मीद वर्ण (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 इसे अपने दिल की सामग्री पर कर सकते हैं।

+0

पहली स्थिति में '% s' के बजाय'% d' टाइप किया है। – Alcott

संबंधित मुद्दे