Dynamische Größe des Arrays



  • Einen schönen zweiten Advent euch allen.

    Ich soll in C folgende Aufgabe realisieren:

    Lassen Sie den Benutzer einen String eingeben. Dieser String soll
    eine Länge von bis zu 200 Zeichen beinhalten können.

    Speichern Sie in 2 Character-Arrays die Vokale und Konsonanten des
    eingegebenen Strings. Die Größe der Arrays soll sich dynamisch der
    Anzahl der auftretenden Vokale und Konsonanten anpassen.
    Entscheiden Sie je Zeichen, ob es sich um ein Vokal (a, e, i, o, u) oder
    um einen Konsonanten handelt und fügen Sie das Zeichen in das
    entsprechende Array ein. Geben Sie die Arrays abschließend als
    Strings aus.

    Dazu wurden uns die Befehle malloc(), sizeof() und free() mitgegeben.

    Ich verfüge lediglich über grundlegende Kenntnisse bei C, die man sich in wenigen Wochen aneigenen kann.

    Mein Programm sieht bislang so aus:

    #include<stdio.h>
    #include<stdlib.h>
    
    int main(){
        int a,b,i;
        char string[200],stringa, stringb, x;
    
        printf("Bitte geben Sie einen Text mit maximal 200 Zeichen ein:\n");
        gets(string);
    
        for(a=0, b=0, i=0; string[i]!='/0' ; i++){
        char x = string[i];
        if(x=='A'  || x=='a' || x=='E'  || x=='e' || x=='I'  || x=='i' || x=='O'  || x=='o' || x=='U'  || x=='u' || ){
             stringa[a]=string[i];
             a++; 
        }
        else 
             stringb[b]=string[i];
             b++; 
        }
    
        printf("\n\n");
        printf("Eingabe:        %s\n",string);
        printf("Vokale:         %s\n",stringa);
        printf("Konsonanten:    %s\n",stringb);
        free(stringa,stringb);
    
        printf("\n\n   ---   Ende   ---\n");
    
        system("pause");
        return 0;
    }
    

    Ich verstehe aber noch nicht wirklich das mit dem dynamischen Arrays.
    Wenn ich "text[200]" nehme, weiß ich, dass ich 200 feste Speicherstellen für meinen String reserviert habe.
    Wenn ich jetzt aber einen dynamischen habe, dann weise ich einem Array mit sizeof die Größe zu und malloc reserviert den Platz und am Ende kann free den Platz wieder freigeben/löschen. Wie man das aber praktisch anhand von Beispielen, die ich verstehe, anwenden kann habe ich noch nicht wirklich gefunden. Daher wollte ich mal mein Bespiel einwerfen. Zudem kommt bei meiner Schleife mit jedem weiteren Vokal immer etwas zum Array dazu. Wie kann man das dann realisieren?

    Ich habs noch nicht einmal geschafft einen ganz normalen Text, den ich an einen Array übergeben habe, so einen dynamischen Speicher zuzuweisen. 😕

    Würde mich über Hilfe sehr freuen.



  • Schönen Advent ebenso.
    Es ist ein verbreiteter Irrglaube, es gebe dynamische Arrays in C.
    Es gibt keine. Auch VLA (erst mit C99) sind in dem Sinne keine dynamischen Arrays, da diese zwar dynamisch, d.h. zur Laufzeit, ihre Größe erhalten, aber diese dann fest bleibt und eben nicht dynamisch erweitert werden kann.
    Dein Lehrer hat also keine Ahnung, stümpert vor sich hin, und du bist der Leidtragende, weil du diesen Unsinn so gelehrt bekommst.

    Zitat aus dem C-Standard:
    An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type. Array types are characterized by their element type and by the number of elements in the array .

    Dein Lehrer widerspricht sich auch selbst, indem er malloc vorgibt; malloc hat aber mit Arrays nicht zu tun, malloc gibt im Erfolgsfall die Adresse auf einen lückenlosen Speicherbereich zurück, den du mit Elementen deiner Wahl (Anzahl und Typ) verwenden kannst und am Ende mit free wieder freigeben kannst.
    Dein Lehrer stümpert auch dahingehend bei der Aufgabenstellung, indem er dir für diesen (konstruierten und unsinnigen weil praxisuntauglichen) Fall den Gebrauch von realloc verbietet. (du sollst ja malloc benutzen).

    Dein '/0' als Stringende ist falsch, es muss '\0' oder auch einfach 0 heißen.
    gets ist eine unsichere Funktion, führt leicht zu UB, wird nur von Anfängern,Laien und eben pfuschenden Lehrern verwendet.

    Was du also machen musst in Sinne der Aufgabenstellung ist:
    2 Speicherbereiche (für Vokale+Konstanten) anlegen, jeweils einen Längenzähler mitlaufen lassen und beim 'Anfügen' eines Zeichens jeweils
    - den Zähler inkrementieren
    - neuen Speicher für die neue Länge mit malloc definieren
    - den 'alten' Inhalt vom alten Speicher hier hineinkopieren
    - den 'alten' Speicherbereich mit free freigeben
    - das Zeichen hinter das letzte Zeichen im neuen Speicher anfügen

    Sinnvollerweise macht man sowas in eine eigenen Funktion, aber das musst du selber entscheiden, vielleicht verbietet dir dein Lehrer ja auch eigene Funktionen.
    Hinweis: außer Vokalen und Konsonanten können auch noch andere Zeichen vorkommen, hierfür gibt es Bibliotheksfunktionen, die dich dabei unterstützen können, z.B. isalpha.



  • Da dir realloc nicht genannt wurde, mach es einfach:

    Zähle die Vokale und Konsonanten.
    Danach holst du dir Speicher mit malloc. Denke an das Stringende.
    Dazu sollten stringa, stringb allerdings Zeiger sein.

    Dann gehst du doch nochmal dur den Text und verteilst die Vokale und Konsonanten.



  • Zähle die Vokale und Konsonanten.
    Danach holst du dir Speicher mit malloc. Denke an das Stringende.
    Dazu sollten stringa, stringb allerdings Zeiger sein.

    Dann gehst du doch nochmal dur den Text und verteilst die Vokale und Konsonanten.

    Das hört sich ziemlich gut an 😋
    Ich muss mal heute und die Tage schauen, obs was wird.
    Zur Aufgabe nochmal: Nix war wirklich verboten, zu verwenden. Man sollte die 3 Befehle nur mit einbauen. Ich sage lieber nicht, wo die Aufgabe herkam^^

    Vielen Dank euch beiden für eure Antworten.


Anmelden zum Antworten