2012-11-21 34 views
25

मैं एक स्ट्रिंग (एक char*) को पार्स कर रहा हूँ और मैं, युगल में स्ट्रिंग से संख्या पार्स इसलिए की तरह करने के लिए sscanf उपयोग कर रहा हूँ:sscanf द्वारा पढ़े गए वर्णों की संख्या प्राप्त करें?

// char* expression; 
double value = 0; 
sscanf(expression, "%lf", &value); 

यह अच्छा काम करता है, लेकिन मैं तो पार्स करने जारी रखना चाहते हैं परंपरागत माध्यमों के माध्यम से स्ट्रिंग। मुझे यह जानने की जरूरत है कि sscanf द्वारा कितने पात्रों को पार्स किया गया है ताकि मैं अपने ऑफसेट पार्सिंग को नए ऑफसेट से फिर से शुरू कर सकूं।

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

उत्तर

39

आप फॉर्मेट स्पेसिफायर %n का उपयोग करें और sscanf() के लिए एक अतिरिक्त int * तर्क प्रदान कर सकते हैं: फॉर्मेट स्पेसिफायर n के लिए

int pos; 
sscanf(expression, "%lf%n", &value, &pos); 

विवरण C99 मानक से:

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

हमेशा यह सुनिश्चित करें कि कार्य किए गए थे sscanf() की वापसी मान की जाँच, और बाद में कोड ऐसा नहीं करता गलती प्रक्रिया चर जिनके मान अपरिवर्तित रहे:

/* Number of assignments made is returned, 
    which in this case must be 1. */ 
if (1 == sscanf(expression, "%lf%n", &value, &pos)) 
{ 
    /* Use 'value' and 'pos'. */ 
} 
+0

मैं इसे (https://msdn.microsoft.com/en-us/library/t6z7bya3.aspx?f=255&MSPPError=-2147217396) जैसे [Microsoft क्रियान्वयन] के लिए काम करने के लिए प्रतीत नहीं कर सकते हैं: ' sscanf_s (पी, "% s% d \ n% n", toString, (int) _countof (toString), और itemCount, &pos); '' pos' बिल्कुल बदलना प्रतीत नहीं होता है। – c00000fd

2
int i, j, k; 
char s[20]; 

if (sscanf(somevar, "%d %19s %d%n", &i, s, &j, &k) != 3) 
    ...something went wrong... 

चर k चरित्र गणना शामिल हो उस बिंदु तक जहां j में संग्रहीत पूर्णांक का अंत स्कैन किया गया था।

ध्यान दें कि %n सफल रूपांतरणों में गिना जाता है। यदि आपको आवश्यकता हो तो आप प्रारूप स्ट्रिंग में %n कई बार उपयोग कर सकते हैं।