1. fscanf()

  2. errno, strerror

  3. Tastatur lesen mit fgetc

  4. Demo: Bewege '*' mit Tastatur


C-KURS WS 01/02 - Übungen4 - Ergänzungen zur Vorlesung


AUTHOR: Gerd Döben-Henisch
DATE OF FIRST GENERATION: Oct-10, 2001
DATE OF LAST CHANGE: Oct-24, 2001
EMAIL:
Gerd Döben-Henisch


Begrenzung für fscanf-Eingaben

Bei einer interaktiven Dateneingabe mittels fscanf() lässt sich im Hinblick auf die vorgegebenen Speichergrenzen eines arrays bei der Eingabe eine obere Grenze mittels eines Delimiters im Rahmen der Konversionsangabe realisieren:

char memory[5];

fscanf(stdin,"%5s",memory);

bzw.

scanf("%5s",memory);

Der Delimiter wird in diesem Fall durch die Zahl 5 realisiert und legt fest, dass nur die ersten 5 Zeichen einer Zeichenkette eingelesen werden. Verwendet man mehr als eine Variable bei einem fscanf-Aufruf mit Delimiter, dann kann es zu unerwünschten Wechselwirkungen zwischen den Variablen kommen. Ausprobieren!



START





errno, strerror

Generell können Funktionen in C Fehlermeldungen erzeugen. Sehr wichtig ist dies speziell bei mathematischen und bei den Input-output Funktionen. Die Fehlermeldungen werden als Zahlen in die Variable errno geschrieben. Will man diese Fehlermeldungen für den Benutzer nutzbar machen, sollte man sie in eine entsprechende Fehlermeldung übersetzen lassen und ausdrucken. Die Übersetzung erfolgt durch die Funktion strerror(errno). Da Funktionen, die eine Fehlermeldung nach errno geliefert haben, diese anschliessend nicht wieder löschen, können Fehlermeldungen in errno längere Zeit stehen, obgleich sie nicht mehr aktuell sind. Es empfiehlt sich daher, vor dem Gebrauch von errno diese Variable auf 0 zu setzen, und zwar bevor man die Funktion aufruft, die eventuell eine Fehlermeldung erzeugen könnte. Ein mögliches Schema zur Ausnutzung der Fehlermeldungen könnte also der folgende sein:

errno = 0;

Aufruf einer Funktion f, die Fehlermeldungen erzeugen kann;

if (errno != 0) fprintf(stderr, "Fehler bei Funktion f mit Meldung %s\n",strerror(errno));

START




Tastatur lesen mit fgetc()

Neben der Eingabe mittels fscanf() ist es manchmal nützlich, die Tatstatur mit fgetc() abzufragen. Ein einfaches Beispiel ist das folgende:



#include <stdio.h>

main(void){

int c;

/**************************************************/

/* LESEN DES KEYBOARDS BIS ZUM ZEICHEN "#" */

/************************************************/

c=0;

c = fgetc(stdin);

while (c != '#') { printf("c = %d = %c \n",c,c); c = fgetc(stdin); }

printf("c nach Ende = %d\n",c);

}

Dieses kleine Programm liest in einer Schleife solange Tastencodes ein, bis das Zeichen '#' gedrückt wird. Jedes gelesene Zeichen wird dann sowohl im Dezimalcode als auch im Druckcode auf dem Bildschirm ausgegeben. Drückt man mehr als eine Taste bevor man die Taste <RETURN> drückt, sieht man, sehr schön, wie die Eingabe gepuffert ist.

START




Bewege das Zeichen '*' über dem Bildschirm

In einem kleinen Demonstrationsprogramm soll die if-else-Konstruktion geübt werden und das Einlesen von Zeichen von der Tastatur. Dazu wird angenommen, dass es folgende array-Variable gibt:

char memory[6];

Die Werte dieser Variablen sollen zu Beginn alle auf den Wert ' ' (:= dezimal 32 = SPACE) gesetzt werden. An der Position memory[2] soll der Wert '*' (:= dezimal 42) gesetzt werden. Man beachte, dass der letzte Wert bei memory[5]='\0' sein muss!

Das Demoprogramm soll jetzt das folgende leisten:

Wenn die Taste '1' gedrückt wird, dann soll der Stern '*' ein Feld im array nach links gesetzt werden. Ist er schon ganz links, (= memory[0]), dann soll er ganz rechts (= memory[4]) wieder eingeführt werden.

Entsprechend: wenn die Taste '3' gedrückt wird, dann soll der Stern um ein Feld nach rechts gesetzt wandern. Ist er schon ganz rechts, dann soll er ganz links 'wieder auftauchen'.

Nach jeder Aktion soll der neue Zustand des array mit printf() angezeigt werden.

Schreiben Sie dazu ein NSD-Diagramm.

Eine mögliche Version in C findet sich hier .



START