2016-04-22 14 views
6

Ho problemi a capire dove e perché sto ricevendo un errore di segmentazione.Errore di segmentazione quando si utilizza regexec/strtok_r in C

Sto scrivendo un codice C che richiede all'utente di inserire un'espressione regolare e compilare e poi inserire una stringa con più frasi:

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 viene utilizzata per dividere la stringa con uno dei due seguendo i delimitatori.,?! e poi la risultante del token (frase) viene utilizzato come parametro stringa nella funzione regexec che cerca per vedere se l'espressione regolare compilata in precedenza è contenuto all'interno del token:

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); 
} 

E 'probabilmente un errore stupido Sono fare in modo che qualsiasi aiuto nel localizzare le ragioni del Segfaul sarebbe molto apprezzato!

EDIT:Spostato regfree in un luogo più adatto. Tuttavia, il segfault si sta ancora verificando. Sono abbastanza sicuro che abbia qualcosa a che fare sia con come viene letta l'espressione regolare sia come viene confrontato in regexec. Incerto, però.

+0

E il debugger? –

+0

Compilare il programma per il debug ed eseguire il programma con un debugger. Il debugger ti dirà esattamente cosa è successo. – wallyk

+0

Il debugger gdb non mi fornisce alcuna specifica - afferma solo che è stato trovato un segfault – higz555

risposta

3

Invece di questo:

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

Write questo:

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

Nella prima variante, para è un puntatore che punta qualche in memoria, e per questo qualche all'utente -stringa chiusa è scritta. Molto probabilmente, para indica un indirizzo non valido, interrompendo immediatamente il programma.

+0

Errore di segmentazione fisso: grazie! Ora le mie espressioni regolari non vengono analizzate correttamente. Torna al tavolo da disegno. – higz555

2

Hai chiamato regfree all'interno del ciclo. La seconda volta intorno al ciclo si chiama regexec sulla memoria liberata con un comportamento indefinito.

0

Si sta utilizzando strtok_r() in modo errato.

Per analizzare una stringa con strtok_r(), nella prima chiamata il primo argomento è un puntatore alla stringa che si desidera analizzare. Le chiamate successive a strtok_r() per analizzare la stessa stessa stringa dovrebbero avere NULL passato come primo argomento. Cosa stai facendo:

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

non ha senso.

+0

La mia comprensione era che il puntatore all'interno di strtok_r stava puntando alla stringa divisa dopo che il delimitatore è stato trovato e quindi poteva tagliare in modo ricorsivo attraverso la stringa. Per me funziona. – higz555

+1

Ha senso per me. Io uso strtok_r così tanto. – Joshua

Problemi correlati