Strings per Bubblesort vergleichen. Brauche Hilfe.



  • Hallo Leute,

    eingabe und ausgabe funktionieren, nur sort() nicht. was mache ich falsch? falls ihr noch mehr zu meckern habt, immer her damit, kritik erwünscht! wir müssen bubblesort nutzen, da anfänger.

    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #define FELD 100
    
    int eingabe(char* text[FELD])
    {
     int count=0, anzahl=0;
     char cpy[FELD], abbruch=0;
    
    do{
       	  printf("\n\n============================================================="
    	  "=============\nBitte geben Sie eine Zeichenkette ein und bestaetigen Sie"
    	  " mit -ENTER-:\n\nEINGABE: ");	 			 		
    
    	  fgets(cpy, FELD, stdin);
    	  text[count] = (char *)malloc(sizeof(char)*strlen(cpy)+1);
    	  strcpy(text[count], cpy);
    	  count++;
    
    	  if(text[count] == NULL)
    	  {
    	  puts("Fehler bei der Speicherzuweisung.");
    	  return 0;
    	  }
    	  printf("\n\n=============================================================="
    	  "============\n-Beliebige Taste zum Programmabbruch\n-Taste -ENTER- fuer "
    	  "erneuter Zeichenketteneingabe\n\nEINGABE: ");
    	  scanf("%c", &abbruch);
    	  }while(abbruch=='\n');
    
    anzahl = count;
    return anzahl;
    }
    // vergleich
    void sort(char *text[FELD],int anzahl)
    {   
    	int x, tausche=0, count=0;
    	char *cpy;
    
    	do {
    		tausche = 0;
    		for (count = 0; count < anzahl; count++) 
    		 {	
    		 	x = strcmp(text[count], text[count+1]);
    
    			if (x > 0) 
    			{
    				tausche = 1;
    				cpy = text[count];
    				text[count] = text[count+1];
    				text[count] = cpy;
    			}
    		 }
    		 // Abbruchbedingung für Eingabe Funktion
    		} while (tausche != 0);
    }
    // ausgabe
    void ausgabe(char* text[FELD], int anzahl)
    {	
    	int count=0;
    
    	for (count = 0; count < anzahl; count++)
    	{
    	printf("\nAUSGABE:\n\n");
    	printf("%s ", text[count]);
    	printf("\n");
    	}
    }
    //MAIN
    int main ()
    {
    // Deklaration und Initialisierung
    char abbruch=0,*text[FELD]; 
    int anzahl=0, count=0;
    
    // Programmüberschrift
    printf("Dieses Programm vergleicht bis zu 100 Zeichenketten miteinander"
    " und gibt sie, \nin lexikalisch richtiger Reihenfolge, zusammenhaengend aus."
    "\nEine einzelne Zeichenkette darf aus maximal 100 Zeichen bestehen."
    "\n==========================================================================");
    
    do
    {
    char abbruch;
    // FUNKTIONEN
    anzahl = eingabe(text);
    sort(text, anzahl);
    ausgabe(text, anzahl);
    
    // Reservierter Speicherbereich wird freigegeben	
    for(count=0; count < anzahl; count++)
    free(text[count]);
    
    printf("\n\n=============================================================="
    	 "============\n-Beliebige Taste zum Programmabbruch\n-Taste -ENTER- zum "
    	 "erneuten Programmaufruf\n\nEINGABE: ");
    	 scanf("%c", &abbruch);
    
    // Abbruchbedingung für Hauptprogramm
    }while(abbruch=='\n');
    
    // Entsorgen des verbliebenen ENTER-Zeichens
    getchar();
    // Liefert den Wert Null an das Betriebssystem zurück
    return 0;
    }
    


  • Wie genau äußert sich denn dieses "funktioniert nicht"? Läuft das Programm durch den Compiler? Stürzt es ab? Sortiert es die Strings falsch?

    Auf Anhieb fällt mir nur auf, daß du im letzten Durchlauf der for()-Schleife auf text[anzahl] zugreifst - das Element wurde aber nicht initialisiert.



  • hmm, weiß jetzt nicht was du meinst, sorry. 😕
    Das Programm stürzt nach dem beenden der eingabe ab. ohne sort() läufts wen.



  • Wie gesagt - in der for()-Schleife der Sortierfunktion gehst du ein Element zu weit. Und dabei stürzt das Programm dann offenbar ab. Versuch's mal mit "for(count=0;count<anzahl-1;++count)".

    PS: Hast du schonmal den Begriff "Debugger" gehört?



  • habe mal zugesehen, ich versuche es mal.
    habe den fehler korrigiert. solange ich zeichenketten alphabetisch eingebe geht es.
    gebe ich sie durcheinader ein und sort() sein zweck erfüllen müsste, stürzt es ab, noch immer.



  • Wie gesagt, schau mal im Debugger etwas genauer hin - an welcher Stelle stürtzt denn das Programm ab?

    (btw, ich hoffe mal, du bleibst innerhalb der Grenzen deiner Arrays "cpy" (für die Eingabefunktion) bzw. "text", wenn du Daten einliest)



  • ja klar, bleibe ich *g*
    ich hatte noch [+1] vergessen beim letzten "tauschen". das reicht aber auch nicht. bin wohl zu blöd dafür.
    also ich habe mal bis zum bestimmten pkt das prog ausgeführt und mir dann die werte angeschaut. leider weiß ich nicht wo er aussteigt.



  • Mit was für einem Compiler/IDE arbeitest du denn? Bei einem guten Debugger kannst du nicht nur "das Programm anhalten und nachschauen", sondern jede Anweisung Schritt für Schritt ausführen lassen und ihre Auswirkungen betrachten.



  • ich nutze dev-c++. bestimmt nciht die erste wahl bei euch. vllt. kann er das auch, müsste ich mal weiter probieren.



  • sorry doppelpost...

    /edit

    scheint jetzt alles i.o. zu sein. THX4HELP! 🙂


Log in to reply