Scanf liest Zahl falsch ein

OP #4854449
Hallo,
ich habe nochmal ein Problem. Beim Einlesen von den Zahlen beim Monat 
&MM die Zahl '08' als '0' in &MM und '8' in &JJJJ abgespeichert. Weiß 
einer warum?
1
#include <stdio.h>
2
#include <stdlib.h>
3

4
void clean_stdin(void)                              // Löschen des Tastaturpuffers
5
{
6
    int c;
7
    do {
8
        c = getchar();
9
    } while (c != '\n' && c != EOF);                        // Beenden des Loops sobald EOF erreicht ist
10
}
11
int main()
12
{
13
    int TT, MM, JJJJ, i, Tage=0;                          // Deklarieren der Variablen
14
    int Monat[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};              // Deklarieren eines Arrays mit den Anfangswerten
15
    printf("Geben Sie das Datum ein: TT, MM, JJJJ\n");                // Aufforderung zur Eingabe des Datums
16
    scanf("%i",&TT);                                // Speichern der Eingabe
17
    scanf("%i",&MM);
18
    scanf("%i",&JJJJ);
19
    clean_stdin();
20
    printf("%i %i %i",TT,MM,JJJJ);
21
    if(!(JJJJ%4)) Monat[2]=29;                            // Schaltjahr: Erhöhen der Tage im Februar
22

23
    while(MM<0 || MM>12 || TT<1 || TT>Monat[MM]){                  // Fehlerfall: falsche Datumseingabe
24
      clean_stdin();                                // Löschen Tastaturpuffer
25
        printf("Unbekanntes Datum! Bitte erneut eingeben! TT, MM, JJJJ\n");      // Aufforderung erneute Eingabe
26
        scanf("%i %i %i",&TT,&MM,&JJJJ);                      // Speichern der neuen Werte
27
        if(!(JJJJ%4)) Monat[2]=29;                          // Schaltjahr: Ein Tag mehr
28
        else Monat[2]=28;                              // Normalfall
29
    }
30
                                            // Berechnung der Tage:
31
    for(i=1; i<MM;i++){
32
        Tage+=Monat[i];
33
    }
34
    Tage+=TT;
35
    printf("Das Datum ist der %i. Tag im Jahr %i", Tage, JJJJ);            // Ausgabe der verbleibenden Tage im Jahr
36
    return 0;
37
}

Die Abstände der Kommentare sind leider verschoben :/
Gast #4854482
> Beim Einlesen von den Zahlen beim Monat &MM die Zahl '08' als '0' in &MM
> und '8' in &JJJJ abgespeichert.

Analog auch beim Tag und beim Jahr.

> Weiß einer warum?

'08' -> Oktalzahl -> '8' ist keine gültige Oktalziffer -> scanf bricht 
ab.
Gast #4854661
Daniel S. schrieb:
> if(!(JJJJ%4)) Monat[2]=29;
Ein Schaltjahr ist es, wenn:
- das Jahr (restlos) durch 4 geteilt werden kann, oder
- das Jahr (restlos) durch 4 und 400 teilbar ist.
1700, 1800 und 1900 sind zwar durch 4 teilbar, sind aber trotzdem keine 
Schaltjahre gewesen. Das Jahr 2000 hingegen war ein Schaltjahr.

Nennt sich Säkularjahr.
https://de.wikipedia.org/wiki/S%C3%A4kularjahr


Daniel S. schrieb:
> printf("Geben Sie das Datum ein: TT, MM, JJJJ\n");                //
> Aufforderung zur Eingabe des Datums
>     scanf("%i",&TT);                                // Speichern der
> Eingabe
>     scanf("%i",&MM);
>     scanf("%i",&JJJJ);
>     clean_stdin();
>     printf("%i %i %i",TT,MM,JJJJ);
>     if(!(JJJJ%4)) Monat[2]=29;                            // Schaltjahr:
> Erhöhen der Tage im Februar
>
>     while(MM<0 || MM>12 || TT<1 || TT>Monat[MM]){                  //
> Fehlerfall: falsche Datumseingabe
>       clean_stdin();                                // Löschen
> Tastaturpuffer
>         printf("Unbekanntes Datum! Bitte erneut eingeben! TT, MM,
> JJJJ\n");      // Aufforderung erneute Eingabe
>         scanf("%i %i %i",&TT,&MM,&JJJJ);                      //
> Speichern der neuen Werte
>         if(!(JJJJ%4)) Monat[2]=29;                          //
> Schaltjahr: Ein Tag mehr
>         else Monat[2]=28;                              // Normalfall
>     }
Das kannst du dir einfacher machen, in dem du eine do-while-Schleife 
benutzt.
#4854885
Da hätte man vielleicht auch selber drauf kommen können.

Aber Annahmen sind beim Programmieren ungünstig.
Man muss wissen was man schreibt.

Daher ist der Hinweis auf die Manpages oder Online-Referenzen 
hilfreicher als das %d.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.