Array Elemente



  • Hey Leute,
    ich konnte durch die Sufu nichts für mein Problem finden und google suche ergibt auch nichts.
    Ich spiele ein ein bischen mit Arrays rum und verstehe
    da etwas nicht:

    #include <stdio.h>
    
    int main ()
    {
    
        int n;
        char c[n];
    
        printf("Bitte maximale Anzahl an Zeichen eingeben: ");
        scanf("%d", &n);
    
        printf("Bitte Zeichenkette eingeben: ");
        scanf("%s", c);
    
        printf("Ihre Eingabe %s: ", c);
        return 0;
    }
    

    Das Programm soll nur eine n große Zeichenkette einlesen. Aber beim Start stürzt es dann ab. Google Suche zum Thema Array ergab auch nicht, dass das was ich gemacht hab überhaupt geht. Muss man da eventuell anders rangehen?



  • Das Array wird in Zeile 7 angelegt.
    Welchen Wert hat da n?

    Der Compiler sollte da eine Warnung ausgeben. Beachte diese und behandele diese wie einen Fehler.
    Wenn du keine Warnung bekommst, dann erhöhe den Warnlevel.

    Denk daran, dass das Terminierungszeichen '\0' auch einen Platz braucht.



  • Dein Programm hat auf ein paar Ebenen Probleme.

    Erst mal sind deine Variablen nicht initialisiert. Dein n hat überhaupt keinen sinnvollen Wert, es könnte 15 drin stehen oder -7 oder 89868976. Alles nicht gut.
    Zweitens verwendest Du Arrays variabler Länge (dein c). Das ist ein recht fortgeschrittenes Instrument, mit einem m.E. recht kleinen Einsatzbereich. Richtig geht so etwas mit dynamischem Speicher, siehe malloc und free.
    Drittens hat die Reihenfolge der Zeilen in C eine feste Bedeutung. Wenn jetzt durch Zufall bei der Initialisierung n in Zeile 7 auf dem Wert 15 gestanden hätte und Du bei scanf jetzt 25 eingibst, ändert sich der Wert nachträglich nicht. Du musst den Speicher für c also nach Zeile 10 beschaffen.
    Viertens musst Du in C etwas aufpassen, wie man Zeichenketten liest. Du kannst, so wie Du das geschrieben hast, immer mehr Zeichen eingeben als n und dann stürtzt dein Programm auch ab (jedenfalls im besten Fall).

    Was genau willst Du machen bzw. lernen? Dann können wir in die Richtung bessere Hinweise geben ...



  • Hey, danke an euch beiden,
    habs jetzt kapirt =).

    Also ich habe eigentlich lediglich mit Arrays experimentiert in ein paar Programmen vorher. Mit malloc hab ichs auch schon ausprobiert und hat auch funktioniert, dann habe ich mir die Frage gestellt obs auch nicht so geht wie ich es oben gemacht habe.
    Also ich möchte eigentlich momentan nur die Grenzen von C austesten und schauen,
    was im Bereich des Möglichen ist und was nicht und wenn möglich, erfahren warum nicht. 🙂

    Und zu Daniel E.'s vierten Punkt:
    Meinst du ich sollte eine Abbruchbedingung oder ähnliches einbauen?



  • Die Angabe der Länge ist ist sehr, sehr zu empfehlen.
    Bei scanf ist es allerdings nicht so einfach, eine variable Länge im Formatstring unterzubringen.
    Da musst du den Umweg über sprintf gehen.

    Bei fgets hingegen ist es kein Problem (das macht aber auch nicht das Gleiche wie scanf )



  • fegts hatte ich mir auch mal angeschaut, sah etwas komplizierter aus.
    Werds mir heute Nachmittag denke ich mal näher anschauen und ausprobieren.



  • Bei fgets wird das '\n' von der Entertaste mit im String abgelegt. Das stört manchmal.

    Zudem ist es etwas problematisch, wenn man scanf und fgets mischt.

    scanf läßt die Zeichen, die nicht zum Formatspecifier passen, im Eingabestrom stehen.

    Bei %d ist das auch das '\n' von der Entertaste.
    fgets nimmt das aber gleich als Zeilenende und liest einen leeren String ein.


Anmelden zum Antworten