Informatik II Grundlagen der Programmierung Programmieren in C Benutzerinteraktion / Ein- und Ausgabe Hochschule Fulda – FB ET Sommersemester 2014 http://c-et.rz.hs-fulda.de Peter Klingebiel, HS Fulda, DVZ
Benutzerinteraktion Oft: Programme interagieren mit Benutzer Ein- und Ausgaben Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Einzelzeicheneingabe mit getchar() Einzelzeichen lesen mit getchar() int getchar(void); #include <stdio.h> ist erforderlich Was macht getchar() Warten auf Tastendruck Benutzer tippt ein Zeichen Ausgabe des Zeichen auf Konsole (Echo) Benutzer tippt <CR> Liefert int, nicht char als Wert Grund: EOF (End of File) mit -1 definiert Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Einzelzeichenausgabe mit putchar() Einzelzeichen schreiben mit putchar() int putchar(int); #include <stdio.h> ist erforderlich putchar() erwartet int, nicht char als auszugebendes Zeichen Ausgabe des Zeichens an aktueller Stelle auf Konsole / Bildschirm / stdout Liefert geschriebenes Zeichen OK EOF bei Fehler Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Einzelzeichenein- und -ausgabe Beispiel int c; while((c = getchar()) ! EOF) putchar(c); Problem: Pufferung der Eingabe getchar()liefert Zeichen nicht sofort sondern erst nach Eingabe von <CR> dann liegt <CR> im Eingabepuffer … … und muss überlesen werden: c = getchar(); // Zeichen lesen getchar(); // CR überlesen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Ausgabe mit printf() 1 Wdh: Formatierte Ausgabe mit printf() Aufruf: printf(fmt, arg1, arg2, ...) printf()hat variable Anzahl Parameter printf()konvertiert und gibt die Parameter unter Kontrolle des Formatstring fmt aus Der Formatstring fmt ist eine Zeichenkette Parameter argN können auch fehlen Die Parameter argN müssen den Typ haben, wie er im Formatstring fmt angegeben ist printf()liefert Anzahl ausgegebener Zeichen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Ausgabe mit printf() 2 Wichtige Umwandlungszeichen für printf Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Ausgabe mit printf() 3 Format erzwingt Anzahl +Typ der Parameter Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Ausgabe mit printf() 4 Umwandlungsbezeichner: bis zu 6 Teile Flags Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Eingabe mit scanf() 1 scanf()ist Gegenstück zu printf() Aufruf: scanf(fmt, arg1, arg2, ...) scanf()hat variable Anzahl Parameter Aus der scanf()-Eingabe werden den als Parameter angegebenen Variablen neue Werte wie im Formatstring fmt festgelegt zugewiesen scanf()liefert als Ergebnis Anzahl erfolgreich zugewiesener Werte Negativer Fehlercode Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Eingabe mit scanf() 2 scanf()ist anders als printf() printf()gibt Werte aus Konstante Werte wie 3.141 Werte von Variablen wie x scanf()weist Variablen neuen Wert zu die Variable x liegt an einer Stelle im Speicher das ist die Adresse der Variablen x An dieser Stelle / Adresse ist der Wert von x entsprechend dem Typ von x in Länge und Form abgelegt (= gespeichert) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Eingabe mit scanf() 3 scanf()soll den eingelesenen neuen Wert für eine Variable an deren Adresse im Speicher ablegen Der unäre Adress-Operator & liefert die Speicheradresse von Variablen im Speicher Bsp: int i; long l; printf(Variable i an Adresse %p\n, &i); printf(Variable l an Adresse %p\n, &l); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Eingabe mit scanf() 4 Wichtige Umwandlungszeichen für scanf() Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Eingabe mit scanf() 5 Modifizierer für scanf()-Format ganz analog zu printf() zwischen Prozentzeichen und Typzeichen h für short l (oder L) für long Asterisk * verhindert die Zuweisung an einen Parameter Zahl zur Bestimmung der Feldbreite Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Eingabe mit scanf() 6 Beispiel für Benutzung von scanf() int tag, monat, jahr; printf(Datum eingeben: ); scanf(%d %d %d, &tag, &monat, &jahr); weiteres Beispiel int tag, monat, jahr; printf(Datum tt/mm/jjjj eingeben: ); scanf(%d/%d/%d, &tag, &monat, &jahr); und noch ein Beispiel int tag, monat, jahr; printf(Datum eingeben: ); scanf(%d%*c%d%*c%d, &tag, &monat, &jahr); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Eingabe mit scanf() 7 scanf.c – Beispieleingaben mit scanf Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Eingabe mit scanf() 8 Gültige Eingabezeichen bei scanf() int key, result; printf(Programm beenden? (J/N) ); result = scanf(%[JNjn], &key); // result = 1 bei JNjn, sonst 0 weiteres Beispiel int key, result; printf(Programm beenden? (Y/N) ); result = scanf(%1[^Yy], &key); // result = 0 bei Yy, sonst 1 Bereichsliste von gültigen Eingaben result = scanf(%[A-Z], &key); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Eingabe mit scanf() 9 Zusammenfassung scanf() Formatstring kann white spaces (Leerzeichen, Tabulator usw.) enthalten, werden ignoriert Umwandlungsangaben fast wie bei printf() Gewöhnliche Zeichen als Begrenzer zwischen den Werten, die den einzelnen Parametern zugewiesen werden Diese Zeichen müssen eingegeben werden, bevor ein Wert für den nächsten Parameter eingelesen werden kann scanf() ohne Adressoperator FEHLER Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Wichtig bei Benutzerinteraktion Letztes Zeichen einer abgeschlossenen Ausgabe: Newline \n Keine zeilenweise Durchmischung von Ausgaben Konvention unterstützt Wiederverwendung von Quelltext Erst printf(), dann scanf() Aussagekräftige Eingabeanforderung Problem: nach getchar() bleibt ein Zeichen im Eingabepuffer Mit weiteren getchar() „weglesen“ Programmieren in C - Peter Klingebiel - HS Fulda - DVZ