2016-03-19 3 views
-4

Dies ist der Code für eine C-Funktion, die 1 zurückgibt, wenn String s1 vor String s2 in einem Dictionary vorkommt oder -1 zurückgibt, wenn s2 vor s2 erscheint oder 0 zurückgibt, wenn sie gleich sind.Code funktioniert nicht. Keep segmentation fault (core dumped)

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

int strcmp_ign_case(char *s1, char *s2){ 
    char *s1Copy; 
    char *s2Copy; 
    char *s1Copy3 = s1Copy; 
    char *s2Copy3 = s2Copy; 
    char *s1Copy2 = s1; 
    char *s2Copy2 = s2; 

    while(*s1Copy2 != '\0'){ 
     *s1Copy3 = *s1Copy2; 
     *s1Copy3 = tolower(*s1Copy3); 
     s1Copy3++; 
     s1Copy2++; 
    } 
    *s1Copy3 = '\0'; 

    while(*s2Copy2 != '\0'){ 
     *s2Copy3 = *s2Copy2; 
     *s2Copy3 = tolower(*s2Copy3); 
     s2Copy3++; 
     s2Copy2++; 
    } 
    *s2Copy3 = '\0'; 

    while((*s1Copy != '\0') || (*s2Copy != '\0')){ 
     if(*s1Copy > *s2Copy){ 
      return 1; 
     } else if(*s1Copy < *s2Copy){ 
      return -1; 
     } else { 
      s1Copy++; 
      s2Copy++; 
     } 
    } 

    if((*s1Copy == '\0') && (*s2Copy == '\0')){ 
     return 0; 
    } 
} 

Ich verstehe nicht, was mit dem Code falsch ist. Bitte hilf mir den Fehler hier zu verstehen. Vielen Dank!

Dies ist die wichtigste, dass ich verwende es zu testen:

void main(){ 
    char *a1 = "hello"; 
    char *a2 = "hell"; 
    char *a3 = "world"; 
    printf("strcmp_ign_case1: %d\n", strcmp_ign_case(a1,a2)); 
    printf("strcmp_ign_case2: %d\n", strcmp_ign_case(a1,a3)); 
    printf("strcmp_ign_case3: %d\n", strcmp_ign_case(a2,a3)); 
} 
+2

Haben verwenden Sie einen Debugger, welche Zeile verursacht den Absturz zu sehen? – immibis

+0

Anfangs sind 's1Copy' und' s2Copy' nicht definiert, oder? Aber Sie verwenden sie dann, um 's1Copy3' und' s2Copy3' zu initialisieren, was sinnlos ist, da Sie nur undefinierte Werte kopieren. Also sind alle 4 davon undefiniert. Dann, in der ersten Schleife, versuchen Sie, in '* s1Copy3' zu speichern. Das ist ein Speicherzugriffsfehler, da Sie str über einen undefinierten Zeiger speichern. Spiel ist aus. –

Antwort

0

Vielen Dank für Ihre Hilfe Jungs.

Ich reparierte mein Fehler wie folgt aus:

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

int strcmp_ign_case(char *s1, char *s2){ 
    char *s1Copy = s1; 
    char *s2Copy = s2; 

    while(*s1Copy != '\0') || (*s2Copy != '\0')){ 
     if(tolower(*s1Copy) > tolower(*s2Copy)){ 
      return 1; 
     } else if(tolower(*s1Copy)< tolower(*s2Copy)){ 
      return -1; 
     } else { 
      s1Copy++; 
      s2Copy++; 
     } 
    } 

    if((*s1Copy == '\0') && (*s2Copy == '\0')){ 
     return 0; 
    } 
} 
2

Siehe Anmerkungen:

int strcmp_ign_case(char *s1, char *s2){ 
    char *s1Copy; // uninitialized pointer 
    char *s2Copy; 
    char *s1Copy3 = s1Copy; // copy of uninitialized pointer 
    char *s2Copy3 = s2Copy; 
    char *s1Copy2 = s1; 
    char *s2Copy2 = s2; 

    while(*s1Copy2 != '\0'){ 
     *s1Copy3 = *s1Copy2; // dereferenced uninitialized pointer (crash)