2013-02-26 7 views
9

साथ अल्पविराम से अलग इनपुट मैं निम्नलिखित इनपुट:पढ़ scanf

AG23,VU,Blablublablu,8 
IE22,VU,FooBlaFooBlaFoo,3 
and so on... 

मैं इसे इस तरह से कुछ कोड का उपयोग कर scanf के साथ "पार्स" करना चाहते हैं:

char sem[5]; 
char type[5]; 
char title[80]; 
int value; 

while(scanf("%s,%s,%s,%d", sem, type, title, &value) == 4) { 
//do something with the read line values 
} 

लेकिन के निष्पादन कोड मुझे देता है: illegale instruction आप इस तरह की अल्पविराम से अलग फ़ाइल कैसे पढ़ेंगे?

उत्तर

28

अल्पविराम एक खाली स्थान के चरित्र नहीं माना जाता है तो फॉर्मेट स्पेसिफायर "%s" की खपत होगी लाइन अपरिभाषित व्यवहार के कारण सरणी sem की सीमा से परे लिखने पर किसी और , और सब कुछ।

while (scanf("%4[^,],%4[^,],%79[^,],%d", sem, type, title, &value) == 4) 

जहां:

  • %4[^,] ज्यादा से ज्यादा चार अक्षर पढ़ने के लिए या जब तक एक अल्पविराम का सामना करना पड़ा है का मतलब है इसे ठीक करने के आप एक scanset उपयोग करने के लिए की जरूरत है।

चौड़ाई निर्दिष्ट बफर ओवररन रोकता है। क्योंकि जब आप कहते हैं

scanf("%s,%s,%s,%d", sem, type, title, &value) 

क्या होता है कि तुम क्या कर कोशिश कर रहे हैं कि आप पहले स्ट्रिंग जो सिर्फ 5 वर्णों में सभी लाइन फिटिंग कर रहे हैं

-1

समस्या यह है कि आप कर रहे हैं है। इसलिए sem[5] अतिप्रवाह, और सभी प्रकार की मजेदार चीजें हैं। इस समस्या से बचने के लिए, मैंने %[^,] अभिव्यक्ति का उपयोग करने का प्रयास किया, लेकिन यह काफी काम नहीं कर रहा है। सबसे अच्छा शर्त तो फिर तुम सिर्फ ch त्यागने कर सकते हैं की तरह

while(scanf("%s%c%s%c%s%c%d", sem, &ch, type, &ch, title, &ch, &value) != EOF) 

कुछ का प्रयोग है। हालांकि ध्यान रखें कि getchar() जैसे इनपुट पढ़ने के लिए अन्य कार्यों का उपयोग करना बेहतर है, और ऐसी चीजें, जो कुछ अर्थों में बहुत तेज और सुरक्षित हैं।

+0

आपकी "सर्वश्रेष्ठ शर्त" के साथ समस्या यह है कि यह काफी काम नहीं करता है। –

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