[C] Benutzereingabe

Hallo,

wie kann ich bei C sicherstellen, dass ein Benutzer nur eine bestimmte Anzahl von zeichen eingibt?
Und 2. Frage, wie ist es möglich, dass ich das string array auf die richtige größe allokieren kann, wenn ich eine (nahezu) unbegrenzte anzahl von chars einlesen will?

mfg
Christian Hund

Hi Christian :wink:

wie kann ich bei C sicherstellen, dass
ein Benutzer nur eine bestimmte Anzahl
von zeichen eingibt?

In gibt es die Funktion:

char *fgets (char *string, int n, FILE *stream);

Diese Funktion liest maximal (n-1) Zeichen aus dem stream. Sollte in dem Stream vorher ein „\n“ (Return) auftauchen, wird dort beendet. In jedem Fall, wird ein Nullbyte als Endekennzeichen an den String gehängt!

Wenn du also maximal 10 Zeichen von der Tastatur einlesen möchtest, dann lautet der Aufruf:

char input[11]
fgets(input,11,stdin);

Und 2. Frage, wie ist es möglich, dass
ich das string array auf die richtige
größe allokieren kann, wenn ich eine
(nahezu) unbegrenzte anzahl von chars
einlesen will?

Da brauchst du dir eigentlich keine Sorgen zu machen. Jeder Compiler hat abhängig vom Betriebssystem eine andere Obergrenze für die Länge eines Strings! Der ANSI-C-Standard velangt, dass ein String wenigstens 509 Zeichen lang sein muss! Wenn du also kompatible Programme schreiben möchtest, sind diese 509 Zeichen auch für dich die Obergrenze. Visual-C unterstützt bis zu 2048 Zeichen pro String!

cu Stefan.

1, Kommt auf dein System an. Unter ANSI C
kannst du read nehmen (von Stdin) und die Bytes explizit angeben (Ich glaube es gaht auch mit scanf) mit MS Visual C++ kannst du
im Klassenassistenten angeben wieveile Buchstaben der Benutzer eingeben soll. Last but not least kannst du auch eine Eigene Funktion schreiben, die z.B. getchar verwendet - manche Systeme wollen hier allerding nach jedem Buchtsamen ein Enter.

  1. a) primitive Variante: Allokiere irgendeine Groesse. Wenn voll, Allokiere das
    Doppelte neu und kopiere die erste Haelfte um - wirf das alte weg usw.

b) elegantere Variente: Verwende eine Verkettete Liste von Arrays

MFG
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

  1. a) primitive Variante: Allokiere
    irgendeine Groesse. Wenn voll, Allokiere
    das
    Doppelte neu und kopiere die erste
    Haelfte um - wirf das alte weg usw.

b) elegantere Variente: Verwende eine
Verkettete Liste von Arrays

Variante b) geht aber von mehr als einem array aus! Ich wuerde a) vorziehen mit der winzigen aenderung, dass ich nicht neu allocieren wuerde, sondern mit dem Befehl realloc einfach die groesse erweitern, dann muss man nicht umkopieren! Das mit dem doppelt ist nur Standard und kein muss. Manchmal geht es auch schneller wenn man eine bestimmte Anzahl von bytes anhaengt, muss man aber abwaegen…

Ciao! Bjoern

e b) geht aber von mehr als einem

array aus! Ich wuerde a) vorziehen mit
der winzigen aenderung, dass ich nicht
neu allocieren wuerde, sondern mit dem
Befehl realloc einfach die groesse
erweitern, dann muss man nicht
umkopieren!

Hm, realloc wird wohl selber umkopieren, wer sagt denn das an der Stelle im Hauptspeicher danach frei ist für die neue Größe…

Bruno