सी

2016-04-22 11 views
6

में regexec/strtok_r का उपयोग करते समय सेगमेंटेशन गलती मुझे यह पता लगाने में समस्याएं आ रही हैं कि मुझे कहां और क्यों सेगमेंटेशन गलती मिल रही है।सी

int main(void){ 

    char RegExp[50]; 
    regex_t CompiledRegExp; 
    char *para; 
    char delim[] = ".!?,"; 
    char *sentence; 
    char *ptr1; 

    printf("Enter regular expression: "); 
    fgets(RegExp, 50, stdin); 

if (regcomp(&CompiledRegExp,RegExp,REG_EXTENDED|REG_NOSUB) != 0) {       

    printf("ERROR: Something wrong in the regular expression\n");       

    exit(EXIT_FAILURE);                 

    } 

    printf("\nEnter string: "); 

strtok_r से किसी के साथ स्ट्रिंग विभाजित करने के लिए प्रयोग किया जाता है:

मैं एक सी कोड है कि इनपुट करने के लिए एक नियमित अभिव्यक्ति उपयोगकर्ता को संकेत देता है और यह संकलन और उसके बाद कई वाक्य के साथ एक स्ट्रिंग दर्ज लिख रहा हूँ निम्नलिखित delimiters।,? और फिर जिसके परिणामस्वरूप टोकन (वाक्य) regexec समारोह है कि यह खोज में स्ट्रिंग पैरामीटर के रूप में प्रयोग किया जाता है, तो नियमित अभिव्यक्ति पहले से संकलित टोकन के भीतर निहित है देखने के लिए:

if(fgets(para, 1000, stdin)){ 

    char *ptr = para; 
    sentence = strtok_r(ptr, delim, &ptr1); 

    while(sentence != NULL){ 

     printf("\n%s", sentence); 

     if (regexec(&CompiledRegExp,sentence,(size_t)0,NULL,0) == 0) { 
     printf("\nYes"); 
     } else { 
     printf("\nNo"); 
     } 
     ptr = ptr1; 
     sentence = strtok_r(ptr, delim, &ptr1); 

    } 
    } 
regfree(&CompiledRegExp); 
} 

यह शायद एक मूर्खतापूर्ण गलती मैं हूँ बनाना लेकिन segfaul के कारणों का पता लगाने में कोई मदद की सराहना की जाएगी!

संपादित करें:regfree अधिक उपयुक्त स्थान पर स्थानांतरित किया गया। हालांकि, segfault अभी भी हो रहा है। मुझे पूरा यकीन है कि इसमें कुछ अभिव्यक्ति है कि नियमित अभिव्यक्ति को कैसे पढ़ा जा रहा है या इसकी तुलना regexec में कैसे की जा रही है। हालांकि, मूर्खतापूर्ण।

+0

डीबगर के बारे में क्या? –

+0

डीबगिंग के लिए प्रोग्राम को संकलित करें और प्रोग्राम को डीबगर के तहत चलाएं। डीबगर आपको बताएगा कि वास्तव में क्या हुआ। – wallyk

+0

जीडीबी डीबगर मुझे कोई विनिर्देश नहीं देता है - सिर्फ दावा करता है कि एक segfault – higz555

उत्तर

3
इसके बजाय इस बात का

:

char *para; 
fgets(para, 1000, stdin); 

लिखें इस:

char para[1000]; 
fgets(para, 1000, stdin); 

पहले संस्करण का में, para एक सूचक है कि बताते हैं कहीं स्मृति में है, और कहीं इस उपयोगकर्ता के लिए केंद्रित स्ट्रिंग लिखा है। सबसे अधिक, para कुछ ऐसे पते पर इंगित करता है जो अमान्य है, तुरंत आपके प्रोग्राम को क्रैश कर रहा है।

+0

फिक्स्ड सेगमेंटेशन गलती - धन्यवाद! अब मेरे नियमित अभिव्यक्तियों का सही ढंग से विश्लेषण नहीं किया जा रहा है। ड्रॉइंग बोर्ड पर वापस। – higz555

2

आपने लूप के अंदर regfree कहा जाता है। लूप के आस-पास दूसरी बार आप अपरिभाषित व्यवहार के साथ मुक्त स्मृति पर regexec कहते हैं।

0

आप strtok_r() गलत तरीके से उपयोग कर रहे हैं।

strtok_r() के साथ एक स्ट्रिंग को पार्स करने के लिए, पहले कॉल में पहला तर्क स्ट्रिंग के लिए एक सूचक है जिसे आप पार्स करना चाहते हैं। उसी स्ट्रिंग को पार्स करने के लिए strtok_r() पर बाद की कॉलों को NULL को पहले तर्क के रूप में पारित किया जाना चाहिए। आप क्या कर रहे हैं:

ptr = ptr1; 
sentence = strtok_r(ptr, delim, &ptr1); 

कोई समझ नहीं आता है।

+0

मेरी समझ यह थी कि strtok_r के भीतर सूचक डिलीमीटर के बाद विभाजित स्ट्रिंग को इंगित कर रहा था और इसलिए यह स्ट्रिंग के माध्यम से बार-बार कटौती कर सकता था। इससे मेरा काम बनता है। – higz555

+1

मुझे समझ में आता है। मैं strtok_r का उपयोग बहुत पसंद करता हूं। – Joshua