Strukturen und mit gets() einen String einlesen?



  • Hallo!

    Bin gerade dabei mich in C einzuarbeiten und dabei bin ich auf folgendes Problem gestoßen. Es soll erst das Tankdatum eingeben werden und später die anderen Daten. Doch er überspringt die Eingabe für das Datum immer und gibt nur auf den Bildschrim die printf()- Anweisung aus und danach sofort ohne Abfrage die nächsten Ausgaben, die dann aber auch eine Eingabe zu lassen.

    Wo ist mein Denkfehler.

    Besten Dank

    JoeF

    #include "stdio.h"
    #include "malloc.h"

    struct tanken
    {
    char datum[9];
    int kilometer;
    float betrag;
    float literpreis;
    float liter;
    };

    void main (void)
    {
    struct tanken *vorgang, *merker;
    int anzahl,i;

    printf("Wie viele Tankungen wollen Sie eingeben? ");
    scanf("%i", &anzahl);

    vorgang = (struct tanken*) malloc (anzahl*sizeof(struct tanken));

    merker = vorgang;

    for (i=0; i<anzahl; i++,vorgang++)
    {

    printf("Tankdatum: ");
    gets(vorgang->datum);

    printf("gefahrene Kilometer: ");
    scanf("%i", &vorgang->kilometer);

    printf("getankte Liter: ");
    scanf("%f", &vorgang->liter);

    printf("Literpreis: ");
    scanf("%f", &vorgang->literpreis);

    printf("Gesamtbetrag: ");
    scanf("%f", &vorgang->betrag);
    }

    vorgang = merker;

    for (i=0; i<anzahl; ++i, vorgang++)
    {
    printf("%i. Gesamtbetrag: %.2f",i+1,vorgang->betrag);
    }

    }



  • Das hat was mit der Pufferung zu tun. Das Return wird mitgespeichert. Siehe hier:

    http://www.pronix.de/C/standard_C/c_programmierung_6.shtml#2



  • Hallo!

    Ich bin ja schwer begeistert, wie schnell man hier eine Antwort bekommt.
    Nochmals besten Dank.
    Und ich dachte schon ich sei zu doof.

    Gruß

    JoeF



  • Achja, und nochwas:

    Das solltest du auch nicht tun (hat aber nix mit dem Fehler zu tun) :

    void main()

    int main (void) ist richtig, da hier immer ein int Wert zurückgegeben wird. Programme (Funktionen) werden meistens mit Return int; beendet.

    Und gets() solltest du auch nicht verwenden. Es ist sehr unsicher, da die Anzahl des erwareteten Werte nicht angegeben werden muss. Nimm fgets() stattdessen.

    Da es unmöglich ist zu sagen, wie viele Zeichen Zeichen gets() lesen
    wird, ohne die Daten vorher zu kennen und da gets() fortfährt und Daten
    über das Ende des Puffers hinaus speichert, ist es sehr gefährlich,
    diese Funktion zu benutzen. Sie wurde benutzt um in Rechner
    einzubrechen. Benutze fgets() anstatt.



  • Danke werde ich mir merken.

    Cu

    JoeF


Anmelden zum Antworten