Sortieren eines Arrays



  • Hallo,

    Ich habe ein Problem bei sortieren eines char Arrays. Die Funktion cmp_Bez sortiert meine Bezeichnungen, also Strings ohne Probleme.
    Wenn ich jetzt aber nur Zahlen in dem Char-Array stehen habe und diese von unterschiedlicher langer Stellenzahl sind, sortiert er diese nicht richtig.
    output:
    1
    11
    111
    13
    2
    3
    4
    5
    6

    Mein Ansatz ist jetzt eine eigene Vergleichsfunktion zu bauen ( fcmp() ), die folgendermaßen aussieht, leider ist die Ausgabe dort überhaupt nicht sortiert

    int cmp_Bez(void* A,void* B)
    {
    
    	return strcmp(((tWare*)A)->vBez,((tWare*)B)->vBez);
    
    }
    
    int fcmp(void* A, void* B)
    {
    	int diff = 0;
    	char* x;
    	char* y;
    	x = (char*)A;
    	y = (char*)B;
    	int i;
    
    	int strleng1, strleng2, n;
    
    	strleng1 = strlen(x);
    	strleng2 = strlen(y);
    
    	n = (strleng1 < strleng2)?strleng1:strleng2;
    
    	diff += strleng1-strleng2;
    
    	for(i = 0; i < n && diff==0; i++)
    	{
    		diff += x[i] - y[i];
    	}
    	return diff;
    }
    


  • Ich nehme mal an, du willst mit qsort sortieren und dafür deine cmp-Funktion als callback benutzen.
    Dann musst du sicherstellen, dass jedes Element deines Array "gleich lang" ist, deine cmp-Funktion bekommt jeweils einen (anonymen) Zeiger auf den Anfang jedes Elements übergeben, wenn du nur Zahlen auswerten willst, ist dein strlen natürlich falsch.



  • ja stimmt,
    das mach ich mit der funktion in dem ich vorne mit nullen auffülle

    int fcmp(void* A, void* B)
    {
    	int diff = 0;
    	char* x;
    	char* y;
    	x = (char*)A->vNr;
    	y = (char*)B->vNr;
    	int i = 0, j = 0;
    	char* buf;
    
    	int strleng1, strleng2, n;
    
    	strleng1 = strlen(x);
    	strleng2 = strlen(y);
    
    	n = (strleng1 < strleng2)?strleng1:strleng2;
    
    	diff += strleng1-strleng2;
    
    	for(j = 0; j < abs(diff); j++)
    	{
    		strcat(buf,"0");
    	}
    
    	if(strleng1 < strleng2)
            {
                    strcat(buf, x);
                    return strcmp(buf, y);
            }
            else if(strleng1 > strleng2)
            {
                    strcat(buf, y);
                    return strcmp(x, buf);
            }
    }
    


  • obergefreiter91 schrieb:

    ja stimmt,

    Du hast nicht verstanden, um was es geht. Dein sämtlicher Code nach strlen ist Schrott, da kannst du "Auffüllen" wie oder was du willst.
    Am besten du zeigst mal dein Array und wie du es befüllst. Deine Aussagen hierzu sind ziemlich nebulös.



  • dis do quatsch wat du schreibst, hast ja ma gar keine ahnung, is do fast richtig , dat funktioniert schon so wie er sich did vorstellt



  • Wandel die Ziffernfolge aus deinem char-Array in der Vergleichsfunktion doch in ein ein (long (long)) int um und vergleiche sie dann.


Anmelden zum Antworten