Problem mit dynamischen char[] und einlesen von Text!



  • Hi!

    Ich möchte ein Programm schreiben, welches eine beliebige Anzahl an characters in ein char-Array speichert!

    Ich hatte folgende Idee:

    #include <stdio.h>
    #include <stdlib.h>
    
    void readWords()
    {
      int elements_number = 0;
      int count;
      char character;
      char text[elements_number];
      do
      {
        scanf("%c",&character);
        text[elements_number++] = character;
      } while((character = getchar()) != EOF);
    
      for(count = 0; count < elements_number; count++)
      {
        printf("%c",text[count]);
      }
    }
    
    int main()
    {
      readWords();
      return 0;
    }
    

    So, wenn ich jetzt:

    echo 'abcdefg' | ./test
    

    in der Konsole eingebe, bekomme ich folgenden Output:

    aceg
    

    Also speichert er genau jedes zweite char in meinem Array!
    Ich hoffe jemand findet den Fehler!
    Danke im Voraus für die Antworten

    mfg trunksen



  • Das

    int elements_number = 0;
      char text[elements_number];
    

    definiert ein Array der Länge 0.
    Da passt nicht ein Zeichen rein.
    Das wird später auch nicht mehr vergrößert.

    Für dynamische Speicheranforderung gibt es malloc() und realloc() .



  • Achso, jedes zweite Zeichen kommt durch das getchar() im while. Das liest auch von stdin.



  • Das war ja mal wirklich schnell!
    Danke!

    definiert ein Array der Länge 0.
    Da passt nicht ein Zeichen rein.
    Das wird später auch nicht mehr vergrößert.

    Aber dann verstehe ich nicht, warum aceg schon gespeichert wurden und eben bdf nicht?
    Ich dachte mir mit

    text[elements_number++]
    

    erhöhe ich denn Indizes des Arrays um eins. Also zuerst eben text[0], dann text[1] etc.

    Achso, jedes zweite Zeichen kommt durch das getchar() im while. Das liest auch von stdin.

    Ok verstehe!
    Aber wenn ich nur

    while(getchar() != EOF)
    

    mache, dann gibt er folgendes aus:

    bei abcdefg: acegg!
    Also immer noch nur jedes zweite Element und g zweimal!

    mfg trunksen

    mfg trunksen



  • Sowohl scanf() als auch getchar() lesen Zeichen ein. Das Zeichen von getchar speicherst du aber nicht ab.
    scanf() liest das 'a', dann getchar() das 'b'.
    scanf() liest das 'c', dann getchar() das 'd'.
    ....

    Verzichte auf das scanf() . Nimm nur ein getchar() in der (while-)Schleife.



  • Sowohl scanf() als auch getchar() lesen Zeichen ein. Das Zeichen von getchar speicherst du aber nicht ab.
    scanf() liest das 'a', dann getchar() das 'b'.
    scanf() liest das 'c', dann getchar() das 'd'.

    Achso, vielen dank!
    Ist ja mal ein dummer Fehler 🙄 !

    Verzichte auf das scanf(). Nimm nur ein getchar() in der (while-)Schleife.

    Werde ich machen!

    mfg trunksen



  • Und mach erstmal char text[1000]; zum ausprobieren vom einlesen.
    Wenn das klappt, kannst du dich an realloc() wagen.


Anmelden zum Antworten