Array aus Strings nach Länge der Strings sortieren



  • Hallo,

    ich würde gerne Strings einlesen und nach der Stringlänge sortieren und wieder ausgeben lassen. Unten stehende Lösung habe ich (funktioniert sowei auch), habe aber das Gefühl, dass der Code sehr umständlich und uneffektiv ist.

    Hat jemand eine Idee wie man das besser machen könnte? Also z.B. gibt es eine andere Möglichkeit als zuerst ein Array mit Pointern auf char anzulegen, denen ich jeweils die Anfangsadresse eines jeden Strings zuweisen muss?

    Klar, der Sortieralgorithmus wird uneffektiv sein, aber so weit bin ich noch nicht. Meine Frage zielt eher darauf ab, ob es eine elegantere Möglichkeit gibt die Strings zu verarbeiten.

    #include<stdio.h>
    #include<string.h>
    
    #define MAXSTR 3
    #define MAXLEN 100
    
    void print_strings(char *[]);
    void sort_strings(char [][MAXLEN]);
    
    int main(void)
    {
    	char str_arr [MAXSTR][MAXLEN];
    	int i = 0;
    
    	printf("Enter %d Strings: ", MAXSTR);
    	while(i < MAXSTR )
    	{	
    		gets(str_arr[i]);
    		i++;
    	}
    
    	sort_strings(str_arr);
    
    	return 0;
    }
    
    void sort_strings(char arr[][MAXLEN])
    {
    	int i, j;
    	int min;
    
    	char *str[MAXSTR];
    	char *temp;
    
    	for(i = 0; i < MAXSTR; i++)
    	{
    		str[i] = arr[i];
    	}
    
    	for(i = 0; i < MAXSTR - 1; i++)
    	{
    		min = i;
    		for(j = i + 1; j < MAXSTR; j++)
    		{
    			if( strlen(str[min]) > strlen(str[j]) )
    				min = j;
    		}
    		temp = str[i];
    		str[i] = str[min];
    		str[min] = temp;
    	}
    
    	print_strings(str);
    }
    
    void print_strings(char *str[])
    {
    	int i;
    
    	for( i = 0; i < MAXSTR; i++)
    		puts(str[i]);
    }
    


  • hau die zeiger auf die strings in ein zeigeraray und dieses kannst du dann mit qsort sortieren.


  • Mod

    ⚠ The gets() function is dangerous and should not be used! ⚠ Nimm fgets mit Längenbegrenzung.

    Zum anderen Problem:

    Also z.B. gibt es eine andere Möglichkeit als zuerst ein Array mit Pointern auf char anzulegen, denen ich jeweils die Anfangsadresse eines jeden Strings zuweisen muss?

    Ach, das finde ich schon ok, du willst ja anscheinend nicht die Originale verändern, da bleibt dir wohl kaum eine andere Möglichkeit.

    Meine Frage zielt eher darauf ab, ob es eine elegantere Möglichkeit gibt die Strings zu verarbeiten.

    Ich würde auf jeden Fall das teure strlen jeweils nur einmal machen wollen. Daher würde ich Paare aus Zeiger und zugehöriger Länge betrachten, wobei die Längen nur einmal zu Anfang gemessen werden. Dann werden diese Paare nach ihren Längen sortiert.

    Klar, der Sortieralgorithmus wird uneffektiv sein, aber so weit bin ich noch nicht.

    Darum gibt's ja auch qsort in der Standardbibliothek, dann muss man sich über so etwas keine Sorgen machen und auch keine Arbeit investieren.

    Was mir derzeit nicht gefällt ist, dass deine Funktionen sehr maßgeschustert sind auf dein Problem. Kleine Änderungen am Problem und du darfst alles (oder vieles) neu machen. Mit nur kleinen Anpassungen wären deine Funktionen viel universeller. Zum Beispiel könnte man die Anzahl der Zeichenketten als Parameter übergeben, anstatt ein Makro zu benutzen. Auch ist mir nicht klar, wieso eine Funktion namens sort_str etwas ausgeben sollte. Bessere Trennung von Zuständigkeiten!


Anmelden zum Antworten