HARALD MELCHER

Startrek in C

Schiff benennen

Das Schiff soll nun von Spieler oder Spielerin einen Namen erhalten – der den Namenskonventionen für Raumschiffe folgt und nur Buchstaben, Bindestrich(e) und Zahlen enthält. Eine do...while-Schleife wird so lange Eingaben anfordern, bis der Name “brauchbar” ist.

In der Schleife steht

  • die Aufforderung einen Namen anzugeben, am besten mit fputs(). Danach soll KEIN Zeilenumbruch folgen, damit der Cursor fragend hinter dem Text stehenbleibt.
  • ein fflush() auf den Ausgabebuffer (der in manchen Implementationen sonst erst bei Newline geschrieben würde). Damit wird der Text im Ausgabebuffer (s.o.) gleich angezeigt.
  • ein fgets(), das den String in einen von dir vorbereiteten Puffer liest. fgets() ist aus Sicherheitsgründen hier besser als gets(), weil es eine Überprüfung auf Maximallänge der Benutzereingabe hat.
  • ein Aufruf einer von dir zu schreibenden Routine trim_lf(char *) mit der Adresse des Namenspuffers als Argument, um das mit eingegebene Newline-Zeichen zu löschen. trim_lf() geht einfache alle Zeichen durch, bis es das Newline (oder Stringende-0) gefunden hat, ersetzt es durch '\0' und kehrt zurück. trim_lf() und alle weiteren Funktionen in main.c solltest du dem Programmcode von in main.c dadurch bekannt machen, dass du es am Anfang der Datei als Funktionsrumpf (Rückgabewert, Name, Argumente) deklarierst.

Die Überprüfung auf Gültigkeit des Namens erfolgt in der while-Bedingung der Schleife. Die Schleife soll sich so lange wiederholen, so lange der Name nicht gültig ist. Für die Überprüfung auf Gültigkeit rufst du in der while-Bedingung die Funktion bool galaxy_enter(char *) auf, die du in der galaxy.c Datei unterbringst und in galaxy.h deklarierst. galaxy_enter erhält dabei einen Zeiger auf den zu validierenden String als Argument und liefert TRUE zurück, wenn der Name zum Betreten der Galaxis gültig ist (andernfalls FALSE).


C kennt von Haus aus den Datentyp bool und die Werte TRUE und FALSE nicht. Die definierst du die in galaxy.h:

typedef char bool;
#define TRUE 1
#define FALSE 0

galaxy_enter geht den übergebenen String Zeichen für Zeichen durch und überprüft jedes Zeichen, ob es alfanumerisch ist oder ein Bindestrich. Ist es keins davon, dann ist an dieser Stelle schon klar, dass der Name ungültig ist und die Funktion kann sofort FALSE zurückgeben. Ist die Funktion am Stringende angelangt ('\0'-Zeichen), dann waren wohl alle Zeichen gültig und die Funktion kann TRUE zurückgeben.