2012-05-31 6 views
11

मेरे पास एक स्ट्रिंग है जिसमें स्याही है और मैं सभी चींटियों को किसी अन्य सरणी में लाने की कोशिश कर रहा हूं। जब sscanf int को खोजने में विफल रहता है तो मैं लूप को रोकना चाहता हूं।sscanf नहीं चलता है, हर बार एक ही पूर्णांक स्कैन करता है! सी

int i; 
int getout=0; 
for(i=0; i<bsize && !getout;i++){ 
    if(!sscanf(startbuffer, "%d", &startarray[i])){ 
    getout=1; 
    } 
} 
//startbuffer is a string, startarray is an int array. 

यह startbuffer में पहली चार होने के लिए startarray के सभी तत्वों को होने में परिणाम: तो, मैं निम्नलिखित किया था। sscanf ठीक काम करता है लेकिन यह अगले int पर नहीं चलता है, यह केवल पहली स्थिति में रहता है।

कोई विचार क्या गलत है? धन्यवाद।

+0

की [sscanf द्वारा पढ़ा वर्णों की संख्या प्राप्त करें?] संभव डुप्लिकेट (http://stackoverflow.com/questions/13503135/get-number-of-characters-read-by-sscanf) – sashoalm

उत्तर

12

प्रत्येक बार जब आप sscanf पर कॉल करते हैं तो वही स्ट्रिंग पॉइंटर पारित किया जाता है। यदि यह इनपुट को "स्थानांतरित" करना था, तो उसे प्रत्येक स्ट्रिंग के सभी बाइट्स को ले जाना होगा जो लंबे तारों के लिए धीमा होगा। इसके अलावा, यह बाइट्स को ले जायेगा कि स्कैन नहीं किया गया था।

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

int nums_now, bytes_now; 
int bytes_consumed = 0, nums_read = 0; 

while ((nums_now = 
     sscanf(string + bytes_consumed, "%d%n", arr + nums_read, & bytes_now) 
     ) > 0) { 
    bytes_consumed += bytes_now; 
    nums_read += nums_now; 
} 
+0

मुझे 'nums_now' के लिए फर्जी मान मिल रहा है जब' bytes_consumed == strlen (string) '(पर अंतिम कॉल जो लूप को तोड़ना चाहिए)। क्या यह भी उम्मीद की जा सकती है? –

+0

@ मैंगडॉर्फ [spec] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/fscanf.html) के अनुसार, "यदि इनपुट पहले रूपांतरण (यदि कोई हो) से पहले समाप्त होता है, और बिना मिलान विफलता हुई, ईओएफ वापस कर दिया जाएगा। " ऐसा लगता है जैसे शून्य को नकारात्मक रूप से नकारात्मक रूप से रीमेप किया जाता है। – Potatoswatter

+0

आह! तो यह बहुत महत्वपूर्ण है कि num_rows एक _signed_ पूर्णांक है। यह बल्कि सूक्ष्म है। –

4

यह एसएसकेएनएफ का सही व्यवहार है। sscanf const char* पर संचालित होता है, फ़ाइल से इनपुट स्ट्रीम नहीं, इसलिए यह किसी भी जानकारी के बारे में कोई जानकारी संग्रहीत नहीं करेगा।

समाधान के लिए, आप अब तक उपभोग किए गए वर्णों की संख्या प्राप्त करने के लिए प्रारूप स्ट्रिंग में %n का उपयोग कर सकते हैं (यह C89 मानक में परिभाषित किया गया है)।

उदा। sscanf("This is a string", "%10s%10s%n", tok1, tok2, &numChar);numChar में अब तक खपत वर्णों की संख्या होगी। स्ट्रिंग स्कैनिंग जारी रखने के लिए आप इसे ऑफ़सेट के रूप में उपयोग कर सकते हैं।

यदि स्ट्रिंग में केवल पूर्णांक होते हैं जो लंबे प्रकार (या लंबे लंबे प्रकार के प्रकार) के अधिकतम मान से अधिक नहीं होते हैं, तो strtol या strtoll का उपयोग करें। सावधान रहें कि सिस्टम के आधार पर long प्रकार 32-बिट या 64-बिट हो सकता है।

4

आप सही हैं: sscanf वास्तव में "स्थानांतरित नहीं" होता है, क्योंकि वहां जाने के लिए कुछ भी नहीं है। यदि आपको इनट्स का गुच्छा स्कैन करने की आवश्यकता है, तो आप strtol का उपयोग कर सकते हैं - यह आपको बताता है कि यह कितना पढ़ता है, ताकि आप अगली पुनरावृत्ति पर अगले सूचक को फ़ंक्शन पर वापस फ़ीड कर सकें।

char str[] = "10 21 32 43 54"; 
char *p = str; 
int i; 
for (i = 0 ; i != 5 ; i++) { 
    int n = strtol(p, &p, 10); 
    printf("%d\n", n); 
} 
3

स्ट्रिंग को एक स्ट्रीम में कनवर्ट करें, फिर आप पूर्णांक प्राप्त करने के लिए fscanf का उपयोग कर सकते हैं। इसे आजमाएं। http://www.gnu.org/software/libc/manual/html_node/String-Streams.html

+0

दिलचस्प, इस POSIX-2008 में जोड़ा गया था: http://pubs.opengroup.org/onlinepubs/9699919799/functions/fmemopen.html – Potatoswatter

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