einlesen und ausgeben



  • Hy!!

    Ich hab hier ein kleines Problem!!Ich muss eine Liste mit Namen einlesen, in ein Array speichen und dann sotiert ausgeben!! Aber irgendwie klappt das nicht!!

    Das hab ich bisher:

    #include <stdio.h>
    #include <string.h>
    
    void insertion_sort(char a[], int N)
    {
    	char i, j, t;
    
    	for (i=1; i<N; i++) 
    	{
    		t=a[i];
    		j=i;
    
    		while (a[j-1]>t)	// Suche nach geeigneter Stelle
    		{
    			strcmp(a[i-1],t);
    
    			a[j]=a[j-1];	// Verschieben nach rechts
    			j=j-1;			// Suche links fortsetzen
    			if(j==0) 
    				break;
    		}
    		a[j]=t;				// Einfügen
    	}
    }
    
    void main()
    {
    	FILE *datei;
    
    	char puffer[]={malloc(sizeof(datei))};
    
    	datei=fopen("names.txt","r");
    
    	while(fgets(puffer,sizeof(datei),datei)) 
    	{ 
    		insertion_sort(puffer, datei);
    		fputs(puffer,stdout);
    	}
    	fclose(datei);
    }
    

    Wer kann mir sagen, was ich falsch habe!! Ich denke zu einfach oder?

    Lg Doty



  • Doty schrieb:

    Ich denke zu einfach oder?

    Ja! 🙂

    also seh ich das richtig (ich denke schon) ... Unter C wird eine Eingabe Zeichenweise in ein Array gespeichert. wenn du also Alex, Birgit, Stephan sortieren möchtest steht an [0]=A [1]=l usw. damit kannst du natürlich nichts anfangen.

    Es ist nicht so einfach wie es in Perl möglich ist. Ich habe Insertionsort mal in Perl realisiert jedoch mit Zahlen 😕 ist glaube ich einfacher 😃

    nunja unter C musst du dann wohl schon mit einem 2 Dimensionalem Array arbeiten.

    char *name[8][64] (8 Sortierbare Namen)(jeweils 64 Zeichenlang).

    vielleicht gehts auch anders ist nur so eine Idee.

    PS: wenn gleich die Profis aus dem Forum antworten entschuldigt wenn etwas nicht ganz so stimmt ich bin selber neu in C wie manche aus dem Forum bestimmt wissen 🙂

    vl konnte ich trotzdem etwas helfen

    gruß

    <<Viro



  • Virokams schrieb:

    ... nunja unter C musst du dann wohl schon mit einem 2 Dimensionalem Array arbeiten.

    char *name[8][64] (8 Sortierbare Namen)(jeweils 64 Zeichenlang).

    vielleicht gehts auch anders ist nur so eine Idee.

    Naheliegend, aber unschön, weil Du damit jede Menge Speicherverschnitt produzieren würdest.

    So, Doty, Schema F sieht ungefähr so aus:
    - char *liste vorsehen
    - char array als Buffer anlegen. Die Länge mit Bedacht wählen, schreibst Du über das Array hinaus, gibt's günstigstenfalls einen "segmentation fault".
    - Einen Namen darin einlesen, mit strlen() Länge ermitteln
    - und per malloc()soviel Speicher einem char
    zuweisen, per strcpy() Buffer nach alloziertem Speicher kopieren.
    - char **liste per malloc/realloc anlegen/erweitern, als letztes Element den zuletzt erhaltenen char* reinkopieren.
    - Für jeden Namen zurück auf "Namen einlesen"
    So kriegst Du letztlich ein Array of strings ohne Speichervergeudung. Beim Sortieren mußt Du dann auch keine Inhalte umkopieren, sondern lediglich die Pointer darauf tauschen.

    Der Abriß in dürren Worten, ganz ordentlich beschrieben ist das in http://www.c-plusplus.net/cms/modules.php?op=modload&name=Downloads&file=index&req=getit&lid=46&nocache=1 PDF- Seite 145ff. und schau zu Strings 153ff. an!


Anmelden zum Antworten