2016-04-16 17 views
1

Ich habe eine Sammlung von Strings von Planetennamen in c. Ich habe sie in einem Zeichenfeld gespeichert. Ich möchte sie aussortieren. Ich weiß, dass es eine String-Vergleichsmethode in c gibt, aber ich muss meine implementieren. In meiner Methode (string_compare(char *planet1, char *planet2)) überprüfe ich Zeichen zwischen zwei Planeten. Wenn der Charakter von planet1 dem von plannet2 folgt, dann gebe ich 1 zurück, sonst wird 0 zurückgegeben. Ich ordne die Array-Elemente dann entsprechend um. Im Moment ist meine Schleife nicht beendet. Es läuft Infinetely. Ich habe auch Probleme beim Austauschen der Array-Einträge. Bitte helfen.Sortierung String-Array in c

#include <stdio.h> 
#include <math.h> 
#include <stdbool.h> 
#include <string.h> 

//method declaration 
int string_compare(char *planet1, char *planet2); 

//main method 
int main() { 
    char *planets[9]= {"Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto"}; 
    bool sorted=false; 

    int i=0, count = 0; 
    do{ 
    int planets_size = (int)sizeof(planets)/sizeof(planets[0]); 
    for(i=0; i< planets_size-1;i++){ 
     char *planet1_pointer = planets[i]; 
     char *planet2_pointer = planets[i+1]; 
     int comparison = string_compare(planet1_pointer,planet2_pointer); 
     if(comparison>1){ 
       planets[i] = planet2_pointer; 
       planets[i+1] = planet1_pointer; 
       sorted = false; 
       break; 
      } else { 
       if(i==planets_size-1){ 
        sorted = true; 
       } 
      } 
     } 
     count++; 
    } while (sorted==false); 
    printf("The planets in alphabetical order are "); 
    //printf("%s",planets); 

    i=0; 
    for (i=0; i<9; i++) { 
     printf("%s " , planets[i]); 
    } 
    return 0; 
} 

int string_compare(char *planet1, char *planet2){ 
    int planet1_size = strlen(planet1); 
    int planet2_size = strlen(planet2); 
    int size=0; 

    if(planet1_size<planet2_size){ 
     size = planet1_size; 
    } else{ 
     size = planet2_size; 
    } 

    int i=0; 
    for(i=0; i < size;i++){ 
     if((int)planet1[i]<(int)planet2[i]){ 
      return 0; 
     } else if((int)planet1[i]>(int)planet2[i]){ 
      return 1; 
     } else { 
      continue; 
     } 
    } 

return 0; 
} 

Mein Code ist oben. Ich bin ein Anfänger in c.

+4

zurückgibt, wenn Sie 'sizeof' auf einen Zeiger, erhalten Sie nur die Größe des * Zeiger * und nicht das, was es zeigt auf. Um die Länge des Strings zu erhalten, verwenden Sie entweder "strlen", oder wenn Sie den Code selbst machen müssen (als Übung), denken Sie daran, dass Strings in C durch das Zeichen ''\ 0'' beendet werden. –

+0

'if (i == planets_size) {' Sei niemals wahr. – BLUEPIXY

+0

für das Verständnis und die Lesbarkeit von uns Menschen: 1) separate Code-Blöcke (für, wenn, sonst, während, tun ... während, wechseln, case, default) über eine leere Zeile. 2) folgen Sie dem Axiom: * nur eine Anweisung pro Zeile und (maximal) eine Variablendeklaration pro Anweisung. 3) konsistent den Code einrücken. Einzug nach jeder öffnenden Klammer '{'. vor jeder schließenden Klammer unindent '}. Verwenden Sie keine Tabs zum Einrücken. Schlage 4 Leerzeichen für jede Einzugsebene vor. – user3629249

Antwort

1

Sie wurden mit for(i=0; i< planets_size-1;i++) geloopt. Beachten Sie die i< planets_size-1, so wird die Bedingung immer falsch sein, da i wird immer weniger als planets_size-1 durch die Definition Ihrer for-Schleife (mit anderen Worten nie gleich).

1

Es gibt zwei Probleme mit dem Code. Einer von ihnen, wie von anderen hingewiesen, ist, dass in der Hauptfunktion wird nie wahr sein, weil in der for Schleife Sie nicht über planets_size-2 gehen werden.

Ein weiteres Problem ist, dass if(comparison>1) wird niemals wahr sein, entweder weil die string_compare Funktion entweder 0 oder 1