beliebig viele, verschiedenlange strings speichern?



  • Hallo, bin ganz neu hier und hab schon die erste Frage:

    Ich bin dabei Datei und Ordnernamen auszulesen und bekomme diese als String übergeben.
    Ich weiß nicht wie lang der String jeweils ist, aber maximal bei Windows ca. 32000 zeichen (wikipedia)

    Ich weiß nicht wieviele dieser Strings ich speichern will.
    Ich möchte alle Strings dynamisch und elegant speichern.

    am einfachsten wär es doch einen Char Array zu nehmen mit 32000 spalten (für den string) und so vielen zeilen wie ich strings speichern will ca. 100 stück?

    als erste verbesserung dachte ich, kann mann mit realloc immer eine zeile hinzufügen, wenn ich einen weiteren string speichern will.

    Dann hab ich den nachteil, dass die meisten dateipfade nur ca. 100 zeichen lang sind und ich soo viel speicherplatz umsonst reserviere. was soll ich da machen?

    wenn ich nur einen string auslese und speichere, dann könnt ich die länge des strings zählen und mit realloc den nicht benötigten speicherplatz wieder frei geben.

    wenn ich aber einen 2-dimensionalen char array habe krieg ich da jetzt n knoten im kopf:
    der kann doch nicht in jeder zeile unterschiedlich viele spalten haben, je nachdem wie lang der string ist!!??

    Geht das vielleicht ganz anders:
    wenn ich einen neuen string rein bekomme muss ich ihn erst zählen,
    dann soviel speicher freigeben wie benötigt wird mit malloc
    und dann einen pointer zu dem string in einem array speichern der dann bei jedem neuen string mit realloc ein stück länger wird.

    dann hätt ich als ergebnis einen array mit pointern, wo die adressen meinser strings drin stehen.
    so denk ich könnts theoretisch gehen, aber die Syntax kann ich grad nicht ausschütteln.

    meine strings zeilenweise in eine datei zu speichern ist doch mist oder? auf festplatte viel zu lahm und überhaupt??

    gibts noch viel bessere methoden, was ganz anderes?

    könntet ihr mir n ganz kurzen Beispielcode tippen, bitte.?

    vielen Dank schon mal.
    Tobi aus rostock



  • Hey ho,
    ich persönlich wirds so machen...

    char puffer[MAX_LEN];
    char **temp;
    int i=0,ggas=gut_geschätzte_anzahl_strings;
    temp=malloc(ggas*sizeof(char*));
    do
    {
    	hole_mehr(puffer);
    	temp[i]=malloc(strlen(puffer)*sizeof(char));
    	strcpy(temp[i],puffer);
    	i++;
    	if(i>gut_geschätze_anzahl_strings)
    	{
    		ggas+=wieviele_da_wohl_noch_kommen;
    		realloc(temp,ggas*sizeof(char *));//k.a. obs so stimmt...
    	}
    }while(weitere_strings_vorhanden);
    

    aber ob die Zeile mit dem <realloc> so stimmt kann ich grad net sagen, musste mal schauen.
    Hinterher haste dann in temp deine ganzen strings stehen, an jedem temp[i] einen string, der soviel speicher braucht wie er lang ist.
    Hoffe es hilft dir weiter.

    mfg Flo



  • in der zeile

    temp[i]=malloc(strlen(puffer)*sizeof(char));
    

    muss es heißen:

    temp[i]=malloc((strlen(puffer)+1)*sizeof(char));
    

    da strlen ja den nullterminator nicht mitzählt...

    mfg Flo



  • Hi,
    Danke schon mal für die Antwort. Das ist wohl n Pointer auf einen pointer wie? das hab ich noch nie ausprobiert...
    Da ich morgen ne Prüfung habe, werd ich mir das erst morgen mal genau anschauen und euch dann auch berichten, obs geklappt hat.

    grüße aus Rostock.
    Tobias


Anmelden zum Antworten