Strings und dynamische Arrays



  • Hallo Leute!

    Ich bin noch recht blutiger Anfänger mit C und beschäftige mich erst seit einer Woche damit.
    Könnt ihr mir eventuell bei untenstehendem Problem helfen?
    Ich möchte eine beliebige Anzahl von Strings (max 255 Zeichen) in ein Array speichern und wieder ausgeben.
    Ich denke das mit dem Eingeben klappt, aber beim ausgeben wird einfach nur der letzte String mehrfach ausgegeben anstelle aller eingegebenen Strings.
    Könnt ihr mir einen Tipp geben?

    Danke auf alle Fälle,
    Michael

    #include<stdio.h>
    #include<stdlib.h>
    
    int main(int argc, char **argv) {
    
    int size;
    int i = 0;
    char **str;
    char Eingabestring[255];
    
    printf("Geben Sie die Anzahl der Zeichenketten ein:\n");
    scanf("%d", &size);
    
    str = (char *)malloc(size*sizeof(char));
    
    while (i<size){
    	printf("\n Geben Sie String Nr. %d ein: ", i);
    	scanf("%s", Eingabestring);
    	printf("Laenge %d ", strlen(Eingabestring));
    	str[i] = (char *)malloc(strlen(Eingabestring)*sizeof(char));
    	str[i] = Eingabestring;
    	i++;
    }
    
    i = 0;
    while (i<size){
    	printf("\n\nString an Stelle %d lautet %s", i, str[i]);
    	i++;
    }
    
    free(str);
    
    return 0;
    }
    


  • str[i] = Eingabestring;
    

    macht nicht das was du beabsichtigst. Es kopiert die Adresse von Eingabestring in alle Arrayelemente. Korrekt wäre hier strcpy.
    (char*)malloc deutet darauf hin, dass dir Unterschiede zw. C und C++ nicht klar sind.



  • str soll doch ein Array von Zeigern auf char sein.
    Dann ist char **str; richtig, aber `str = (char )malloc(sizesizeof(char));

    ` schon nicht mehr.
    1. ist str vom Typ char**
    2. du willst ja Zeiger unterbringen.
    3. ist de cast in C nicht nötig (in C++ schon)

    str = malloc(size*sizeof(char*));
    

    Bei str[i] = (char *)malloc(strlen(Eingabestring)*sizeof(char)); fehlt der Platz fürs Stringendezeichen ('\0') und der cast ist nicht nötig.
    sizeof(char) ist per Definition 1, aber ok.

    str[i] = malloc((strlen(Eingabestring)+1)*sizeof(char));
    

    Mit str[i] = Eingabestring; läßt du str[i] auf Eingabestring zeigen. Da steht immer der letzte Namen drin.

    Wenn du den Inhalt von Eingabestring nach str[i] haben willst musst du strcpy() nehmen.

    Da fehlen alle Grundlagen von C, die man bei malloc schon haben sollte, da Strings in den Büchern/Tutorials vor malloc behandelt werden.
    Wie lernst du denn?



  • Ich lern ungewollt und unter Zwang 😛
    Aber danke für die Tipps!

    Alles Gute
    MI



  • Ein dynamisches Array ist übrigens nicht auf eine fixe Größe begrenzt.



  • Unsinn.
    Jedes Array ist auf eine fixe Größe begrenzt, bei VLA kann man die initial auch erst zur Laufzeit festlegen, ändert aber nichts daran, dass die Größe/Anzahl der Elemente fix ist.



  • Die Größe lässt sich doch bei dyn. Arrays durch realloc wieder ändern. Was ist daran fix?



  • Kannst du lesen? Offenbar nicht.


Anmelden zum Antworten