2011-04-21 23 views
6

मैं की तरहवर्ग कोष्ठक] sscanf में

"[25, 28] => 34" 

मैं इसे बाहर का परीक्षण करने के लिए एक छोटा सा कार्यक्रम लिखा लाइनों स्कैन करना चाहते हैं पलायन:

#include <cstdlib> 
#include <iostream> 

int main() { 
     char* line = "[25, 28] => 34"; 
     char a1[100], a2[100]; 
     int i; 
     sscanf(line, "[%[^,], %[^\]] => %i", a1, a2, &i); 
     std::cout << "a1 = " << a1 <<"\na2 = " << a2 << "\ni = "<<i <<"\n"; 
     return 0; 
} 

संकलन इस देता है

warning: unknown escape sequence '\]' 

और आउटपुट

a1 = 25 
a2 = 28 
i = -1073746244 

अगर मैं

sscanf(line, "[%[^,], %[^]] => %i", a1, a2, &i); 

के लिए इसे बदल मैं कोई संकलक शिकायतें मिल, लेकिन अभी भी

a1 = 25 
a2 = 28 
i = -1073746244 

मैं जानता हूँ कि समस्या दूसरा टोकन में है क्योंकि

sscanf(line, "[%[^,], %[]] => %i", a1, a2, &i); 

देता

a1 = 25 
a2 = 28 
i = 34 

लेकिन मैं दूसरे टोकन के लिए एक समाप्ति स्थिति का उपयोग करना चाहता हूं। मैं उसको कैसे करू?

उत्तर

10

आप

sscanf(line, "[%[^,], %[^]]] => %i", a1, a2, &i); 

नोट लगातार तीन ] वर्ण चाहते हैं - पहला वर्ण आप %[ सेट में मैच के लिए नहीं करना चाहती है, दूसरी %[ और के साथ शुरू सेट समाप्त हो जाती है तीसरे मूल रूप से "कैसे एक scanf scanset में ] चरित्र शामिल करने के लिए करने पर निर्भर करता इनपुट

-2

तुम कोशिश कर सकते

sscanf(line, "[%s, %s] => %d", a1, a2, &i); 
+0

-1 काम नहीं करेगा - '% s 'अगले व्हाइटस्पेस तक सब कुछ मेल खाता है, इसलिए यह निम्न विराम चिह्न (', 'या'] ') को अवशोषित करेगा और बाद वाला मैच विफल हो जाएगा। –

+0

भगवान मैं समय के पीछे थोड़ा सा हूँ ... 8) अच्छी तरह से मतदान नीचे। – ColWhi

4

दूसरों के रूप में उल्लेख किया है ... मैं वास्तव में यकीन है कि क्या आप यहाँ क्या करना चाहते हैं नहीं कर रहा हूँ ...

यह मानते हुए कि कोष्ठक के बीच बातें हमेशा पूर्णांक हैं , तो आप सिर्फ कर सकता है:

int a, b, c; 
sscanf(line, "[%d, %d] => %d", &a,&b,&c); 

आप regex का उपयोग कर और कुछ सामान्य कोष्ठक के बीच में पारित सामान चाहने के बारे में वास्तव में आग्रहपूर्ण कर रहे हैं, क्या आप के लिए देख रहे हैं:

sscanf(line, "[%[^,], %[^]]] => %d", a1, a2, &i); 

दूसरा रेगेक्स अंत में ] को छोड़कर सभी वर्णों से मेल खाना चाहिए। मेरा मानना ​​है कि आप ] से पहले भागने की कोशिश कर रहे थे, लेकिन यह आवश्यक नहीं है और संकलक एक त्रुटि फेंक रहा है क्योंकि यह नहीं जानता कि उस भागने को कैसे संभालना है।

a2 के लिए कब्जा खंड में 3 ] रहे हैं क्योंकि पहले कह रहा है "चरित्र मैच सेट में इस चरित्र को शामिल नहीं करते," दूसरा चरित्र मैच सेट बंद बंद हो रहा है, और तीसरे ] से मेल खाता है [25, 28] => 34 इनपुट में।

यदि मैंने पूरी तरह से आपके प्रश्न को गलत समझा, तो बस स्पष्ट करें और मैं संशोधित कर सकता हूं।

0

यह मुझे एक कंपाइलर (या, वास्तव में, लाइब्रेरी) बग की तरह लगता है (हालांकि आपको केवल तीसरे दाएं-ब्रैकेट की आवश्यकता है, केवल दो नहीं)। मानक के अनुसार (सी 99, §7.19.6।2):

रूपांतरण विनिर्देशक [] या से शुरू होता है [^], सही ब्रैकेट चरित्र scanlist में है और अगले निम्नलिखित सही ब्रैकेट चरित्र मिलान सही ब्रैकेट कि विनिर्देश समाप्त होता है;

2

यह अपने प्रश्न की तरह लग में ] चरित्र से मेल खाता है "। यह संभव है और आपको इसे बचने की जरूरत नहीं है। विशेष रूप से उस उद्देश्य के लिए भाषा विनिर्देश बताता है कि जब ] चरित्र तुरंत [ चरित्र का अनुसरण करता है या तुरंत ^ वर्ण का अनुसरण करता है, तो ] को स्कैनसेट का हिस्सा माना जाता है, न कि समापन ब्रैकेट। तो, आपके मामले में प्रारूप विनिर्देशक को "[%[^,], %[^]]] => %i" के रूप में देखना चाहिए। कोई \ आवश्यक है।

मुझे लगता है कि आपको लगभग सही मिला है, सिवाय इसके कि आप दूसरे स्कैनसेट के बाद तीसरा ] चरित्र भूल गए हैं।