Eingabe mehrerer Datentypen
-
hallo miteinander,
ich möchte die Uhrzeit folgendermaßen darstellen --> 8:30
So wie ich das gemacht habe, nimmt er zwar den Wert für die stunden an, allerdings
funktioniert das mit den minuten nicht.
Wie kann ich nun beides mit einem dopelpunkt dazwischen auslesen?scanf("%d&c&d", &stunden,2,&doppelpunkt,1, &minuten,2); printf("%d Stund\n", stunden); printf("%d Minute\n", minuten);
Einen string wollte ich nicht nehmen, da ich mit den Uhrzeiten nacher noch weiterrechnen muss.
-
ich meine natürlich, wie ich beides mit einem doppelpunkt dazwischen auslesen kann?
-
int hour, minute; scanf("%d:%d", &hour, &minute);
-
icarus2 schrieb:
int hour, minute; scanf("%d:%d", &hour, &minute);
Bei deinem Code kann man 3265:72093823 eingeben.
Lies einfach einen String ein und extrahiere deine Stunden und Minuten daraus.
Einen String kann man auch einfacher auf Fehlereingaben überprüfen.
-
Die beiden int-Werte kann man auch auf gültige Werte testen.
-
Belli schrieb:
Die beiden int-Werte kann man auch auf gültige Werte testen.
Ja, richtig.
Im Prinzip müsste man das so machen, dass nur Zeichenweise eingelesen wird.
Dann kann man bei der ersten Ziffer stehen bleiben, wenn der Nutzer weiterhin Ziffern eingibt und die erste Ziffer mit der neuen Ziffer dann überschreiben.
Erst dann, wenn er TAB, Enter oder z.b. : eingibt, dann sollte das Programm ins nächste Feld springen.
-
Oder alternativ, das Programm springt autoamtisch ins Minutenfeld, sobald 2 Ziffern eingegeben wurden.
Und die Eingabe einer Ziffer > 2 sollte man bei der 2. Ziffer für die Stundenanzeige unterbinden.
-
Bloß blöd, daß das mit Standard-C nicht geht.
-
Swordfish schrieb:
Bloß blöd, daß das mit Standard-C nicht geht.
Ja, muss man eben ncurses.h oder conio.h nehmen oder was halt sonst auf der Zielplattform dafür notwendig ist.
Aber stimmt schon, es ist schon sau doof, dass die da im C Standard nichts entsprechendes definiert haben.
-
Quatsch, es ist Unsinn auf zeichenweises Lesen auszuweichen nur weil einem der Horizont für passende scanf-Formatstrings für diese einfache Aufgabe fehlt.
-
Hm. Das war sicher auch der Grund für die ersten GUIs ... den Leuten hat einfach der Horizont für scanf-Formatstrings gefehlt.
Mann, du kommst wieder mal so dermaßen eingebildet und herablassend rüber, man könnt kotzen.
-
Wutz schrieb:
Quatsch, es ist Unsinn auf zeichenweises Lesen auszuweichen nur weil einem der Horizont für passende scanf-Formatstrings für diese einfache Aufgabe fehlt.
Gut, dann will ich jetzt von dir Code sehen, der scanf verwendet und folgendes kann:
Im Prinzip müsste man das so machen, dass nur Zeichenweise eingelesen wird. Dann kann man bei der ersten Ziffer stehen bleiben, wenn der Nutzer weiterhin Ziffern eingibt und die erste Ziffer mit der neuen Ziffer dann überschreiben. Erst dann, wenn er TAB, Enter oder z.b. : eingibt, dann sollte das Programm ins nächste Feld springen. das Programm springt autoamtisch ins Minutenfeld, sobald 2 Ziffern eingegeben wurden. Und die Eingabe einer Ziffer > 2 sollte man bei der 2. Ziffer für die Stundenanzeige unterbinden.
es sollte auch verhindert werden, dass das hier geht:
Bei deinem Code kann man 3265:72093823 eingeben.
Beim Zeichenweise einlesen kann ich das alles umsetzen, weil ich die dafür notwendige Kontrolle habe.
Ich kann also mit dem Cursor auf dem Fleck stehen bleiben, wenn der Benutzer, bei einer Zahl, die nur zweistellig ausgegeben werden soll (-> Uhrzeit),
mehr Ziffern eingibt.Aber du behauptest ja, du könntest das mit scanf auch lösen, also, beweise und liefer den Code.
-
Meinst Du nicht, dass es Sinn machen könnte, die Eingabe anzunehmen, zu prüfen, im Fehlerfall eine Fehlermeldung auszugeben und dann eine erneute Eingabe zu ermöglichen?
Das ist das übliche Prozedere, soweit wir von einem Konsolenprogramm sprechen.
-
Belli schrieb:
Meinst Du nicht, dass es Sinn machen könnte, die Eingabe anzunehmen, zu prüfen, im Fehlerfall eine Fehlermeldung auszugeben und dann eine erneute Eingabe zu ermöglichen?
Das ist das übliche Prozedere, soweit wir von einem Konsolenprogramm sprechen.Ich habe mit Turbo Pascal das Programmieren angefangen und die Kontrolle, die ich unter DOS bezüglich der Zeichenein- und Ausgabe mit TP standardmäßig habe, sehr geschätzt.
In der Unix & Terminal Welt mag das anders aussehen, aber wenn es schön und elegant sein soll, dann geht das eben nicht mit scanf.
Aber Wutz kann mich noch gerne vom Gegenteil überzeugen.
-
Wenn es schön und elegant sein soll, dann nimmt man eine GUI und keine Konsole.
-
Nein, das hängt nicht davon ab, sondern davon, was einem zur Verfügung steht.
Und manchmal hat man eben keine grafische Oberfläche, sondern nur eine textbasierte Oberfläche und dafür macht man dann TUIs, wenn es schön und elegant sein soll.
Beispiele:
http://de.wikipedia.org/wiki/Zeichenorientierte_Benutzerschnittstelle
http://en.wikipedia.org/wiki/Text-based_user_interface
-
Und für TUIs reicht scanf dann nicht mehr, da braucht man dann mehr Kontrolle, die ein zeichenbasiertes gethc() aus z.B. ncurses einem bietet.