Jahreszahleingabe
-
chille07 schrieb:
Beim scanf dürfte ein %s besser wirken und ich denke das & vor "eingabe" beim scanf sollte weggelassen werden.
weiter gehts dann wohl mit for und if
Stimmt bei scanf muss %s und nicht %c hin. Aber das & vor eingabe ist richtig...
Ja, jetzt kommt wohl for und if
Wie stelle ich das an?
Muss ich jetzt mit if(eingabe[i]=='.') prüfen? Nur wie gehe ich dann weiter vor?
Sorry, aber ich hab wirklich keine Ahnung wie ich da genau vorgehen muss.
-
Du kannst einen Teil der Formatüberprüfung von scanf erledigen lassen.
Scanf gibt die Anzahl der erfolgreich eingelesenen Variablen zurück.unsigned Tag, Monat, Jahr; int c = 0; printf("Geben Sie das Datum in der Form TT.MM.JJJ ein: "); if ( 3 != scanf( "%2u.%2u.%4u", &Tag, &Monat, &Jahr ) ) { puts("Das \x9A\x62\x65n wir noch mal.\n"); return 1; } if ( (c = getchar()) != '\n' ) { printf("Ung\x81ltiges Zeichen in der Eingabe: %c\n", c ); return 1; }
Ob Tag, Monat, Jahr sinnvolle Werte sind, wäre noch zu prüfen.
-
Perfekt das klappt!
Warum benutzt du unsigned? Kann ich auch einen anderen Datentyp benutzen?
Nur diesen Teil verstehe ich nicht:
if ( (c = getchar()) != '\n' ) { printf("Ung\x81ltiges Zeichen in der Eingabe: %c\n", c ); return 1; }
-
Wirt.-Inf.07 schrieb:
Perfekt das klappt!
Statt unsigned kann ich doch auch int benutzen oder?
Klar, wenn der Benutzer schlecht drauf ist, kann er ja nen negativen Tag eingeben oder so.
Wirt.-Inf.07 schrieb:
Nur diesen Teil verstehe ich nicht:
Die Funktion scanf hört auf zu lesen, nachdem sie das Jahr eingelesen hat.
Was dann noch im Puffer steht, ist ihr egal.Wenn richtig eingegeben wurde, steht nur noch das '\n' im Puffer.
Wenn noch mehr als das '\n' im Puffer ist, dann entspricht es nicht dem gewünschten Format.
-
proggingmania schrieb:
Wirt.-Inf.07 schrieb:
Perfekt das klappt!
Statt unsigned kann ich doch auch int benutzen oder?
Klar, wenn der Benutzer schlecht drauf ist, kann er ja nen negativen Tag eingeben oder so.
Wirt.-Inf.07 schrieb:
Nur diesen Teil verstehe ich nicht:
Die Funktion scanf hört auf zu lesen, nachdem sie das Jahr eingelesen hat.
Was dann noch im Puffer steht, ist ihr egal.Wenn richtig eingegeben wurde, steht nur noch das '\n' im Puffer.
Wenn noch mehr als das '\n' im Puffer ist, dann entspricht es nicht dem gewünschten Format.Danke für deine Antwort. Jetzt habe ich alles verstanden.
Dann probier ich jetzt mal das Programm zu erweitern...
-
-
Ich habe doch noch eine Frage und zwar hierzu:
if ((c = getchar()) != '\n' ) { printf("Ungueltiges Zeichen in der Eingabe: %c\n", c ); }
Wenn ich beispielsweise 123.45.6789 eingebe, dann zeigt der mit die 3 als ungueltig an; was ja auch richtig ist.
Jedoch verstehe ich nicht wie man darauf kommt. Mir ist klar, dass wenn noch etwas im Puffer steht, dass der anzeigt, dass es ein ungueltiges Zeichen ist, doch wie kommt der genau auf die 3, also auf den Fehler?
-
Ganz einfach:
"%2u.%2u.%4u"
Das bedeutet, es kommen zwei Ziffern und dann der Punkt.
Wenn bei %2u jetzt 3 Ziffern stehen, ist es die dritte Ziffer, die den Fehler auslöst und daher eindeutig identifiziert wird.lg Max
-
Die Funktion scanf liest so lange ein, wie die Eingabe mit dem Formatstring
("%2u.%2u.%4u" ) übereinstimmt.Das erste %2u 'sagt:' lies einen unsigned int, der mindestens aus einem, maximal aus zwei Zeichen besteht.
Deine 123 ist ein unsigned int, der aus 3 Zeichen besteht und daher nicht mit dem Formatstring übereinstimmt. Deshalb wird die Zahl 3 von scanf nicht verwertet und unverdaut in den Eingabepuffer zurück gepackt.
-
proggingmania schrieb:
Die Funktion scanf liest so lange ein, wie die Eingabe mit dem Formatstring
("%2u.%2u.%4u" ) übereinstimmt.Das erste %2u 'sagt:' lies einen unsigned int, der mindestens aus einem, maximal aus zwei Zeichen besteht.
Deine 123 ist ein unsigned int, der aus 3 Zeichen besteht und daher nicht mit dem Formatstring übereinstimmt. Deshalb wird die Zahl 3 von scanf nicht verwertet und unverdaut in den Eingabepuffer zurück gepackt.Aha ok. Das die Zahl dann in den Eingabepuffer zurück gepackt wird wussste ich nicht. Aber er zeigt immer nur den ersten Fehler an, wenn ich bei Monat beispielsweise 123.456.7890 eingebe, dann zeigt der mir nur die 3 als Fehler an. Heisst das, dass wenn er einen Fehler findet abbricht?
-
Wirt.-Inf.07 schrieb:
... Aber er zeigt immer nur den ersten Fehler an, wenn ich bei Monat beispielsweise 123.456.7890 eingebe, dann zeigt der mir nur die 3 als Fehler an. Heisst das, dass wenn er einen Fehler findet abbricht?
Genau.