2017-11-27 2 views
-3

Question: Intersecting Merge SortWie Debuggen eines Segmentation Fault in diesem Code?

 Input--abc//first string 
      def//second string 
       Output-- adbecf 
       Input 2-- abc 
         defgh 
       Output adbecfgh** 

Ich bekomme Segmentierung Fehler in meinem Code und ich weiß nicht warum. Ich glaube nicht, dass mein Code auf einen ungültigen Zeiger zeigt. Wie kann ich diesen Code entfernen?

Hier ist meine Lösung Code in C

#include <math.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <limits.h> 
#include <stdbool.h> 
char *mergeTwo(char *a,char *b) 
{ char *c;int k=0,i=0; 
    while(1) 
    { 
     if(a[i]!='\0' && b[i]!='\0') 
     { 
      if(a[i]>=b[i]) 
      { 
       c[k++]=b[i]; 
       c[k++]=a[i]; 
      } 
      else 
      { c[k++]=a[i]; 
       c[k++]=b[i]; 

      } 
     } 
     else if(a[i]!='\0' && b[i]=='\0') 
     { 
      c[k++]=a[i]; 
     } 
     else if(a[i]=='\0' && b[i]!='\0') 
     { 
      c[k++]=b[i]; 
     } 
     else if(a[i]=='\0' && b[i]=='\0') 
     { 
      c[k]='\0'; 
      break; 
     }i++; 
    } 
return c;  
} 

int main() { 
    char str1[100],str2[100],*str3; 
    gets(str1); 
    gets(str2); 
    str3= mergeTwo(str1,str2); 
    puts(str3); 
    return 0; 
} 

Fehler:

ERROR

+2

Wo ordnen Sie den Speicher, c Punkte ?? – drescherjm

+0

Zuerst sollten Sie 'str1' und' str2' initialisieren (oder mindestens NULL-terminieren)! –

Antwort

1

Zwei Ausgabe:

Wie dresxherim bemerkt: * c ist kein Speicher zugewiesen. und ist nur frei, wenn der Prozess existiert.

Die aktuelle Logik geht davon aus, dass beide Strings die gleiche Länge haben. Wenn einer länger ist, erhalten Sie auch einen Segmentierungsfehler.

char *mergeTwo(char *a,char *b) 
{ char *c;int k=0,i=0, j=0; 

    c = malloc(strlen(a) + strlen(b) + 1); // include null for termination. 

    while(1) 
    { 

// Code reworked for if string A and B are different lengths. 

    if(a[i]!='\0' && b[j]!='\0') 
    { 
     if(a[i]>=b[j]) 
     { 
      c[k++]=b[j++]; 
      c[k++]=a[i++]; 
     } 
     else 
     { c[k++]=a[i++]; 
      c[k++]=b[j++]; 

     } 
    } 
    else if(a[i]!='\0') 
    { 
     c[k++]=a[i++]; 
    } 
    else if(b[j]!='\0') 
    { 
     c[k++]=b[j++]; 
    } 
    else { // if(a[i]=='\0' && b[j]=='\0') 

     c[k]='\0'; 
     break; 
    } 
} // end while 

return c;  
} 



int main() { 
    char str1[100],str2[100],*str3; 
    gets(str1); 
    gets(str2); 
    str3= mergeTwo(str1,str2); 
    puts(str3); 
    free(str3); // free memory allocated. 
    return 0; 
} 

Gespeichert als test.c, Compilieren und Tesed auf OS X:

$ cc test.c 
$ ./a.out 
warning: this program uses gets(), which is unsafe. 
abc 
def 
adbecf