Einlesen von der Konsole
-
Hallo ich habe mal 2 Fragen:
Ich lese mit scanf immer von der Konsole ein. Allerdings schaffe ich es immer nur einen Wert einzulesen ( meinst einen String, einen Integer oder float oder was auch immer ist auch noch nicht das Problem )
Aber was mache ich, wenn ich einen Satz einlesen will? Problem: Ich weiss die Anzahl der whitespace zeichen nicht! Gibt es eine Möglichkeit alles einzulesen bis zu einem '\n' ??
Die zweite Frage ist, ob es möglich ist, eine eingabe schon zu lesen, bevor enter gedrückt wird ( also quasi ungepuffert ). Wenn ja, bitte ich um Beispielcode.
Gruß
-
Die Lösung deines 1. Problems lautet fgets.
Zu 2: Keine Ahnung.
-
zu 1. ausser mit fgets geht's auch mit scanf
char buffer[30]; scanf("%29[^\n]", buffer );
Hat beides seine Vor- und Nachteile.
fgets hängt das '\n' an den string an.
scanf lässts im puffer.
Kurt
-
Naja, das \n zu überschreiben geht ja in einer Zeile
buffer[strlen(buffer)-1]='\0';
-
Diamond, ja nachher geht das... aber wenn du das \n überschreiben willst ist es ja schon zu spät. scanf liefert dann nämlich nur das erste wort. Also bisschen dämlich.
-
und irgendwelche vorschläge zu 2.) ???
-
in der llibc fällt mir da nix zu ein aber ncurses hat dazu die funktion getch(), die du zusammen mit cbreak() nutzen kannst dann sollte das laut manual gehn
-
hab eben noch mal die libc durchwühlt und was über low-level terminal interface oder so gefunden.
http://www.gnu.org/software/libc/manual/html_node/Low_002dLevel-Terminal-Interface.html#Low_002dLevel-Terminal-Interfaceschaut alles recht kompliziert aus, von daher doch lieber eine schon fertige lösung wie ncurses. wenn du nur nen weg suchst, dass du quasi nen prompt willst, solltest du mal libtecla dir anschauen is recht einfach gehalten, hat aber recht nette features (history, completion, editing ua)
http://www.astro.caltech.edu/~mcs/tecla/index.html
ich benutz die selber und muss sagen für meine zwecke mehr als genug
-
ja ich hätte nur am liebsten eine ansi c lösung. Vor allem weil es plattformübergreifend verwendbar sein soll.
-
ansi c garantiert dir weder zeilengepufferte noch ungepufferte eingabe.
begnuege dich mit getchar(), den genannten ansi c loesungen oder zusatzlibraries.
-
Hallo,
hmm, mit dieser ungepufferten Geschichte.
Gibt es nicht die Möglichkeit, irgendwie direkt
den Tastaturpuffer auszulesen?
Das klappte ja schon damals beim C64.Bs,
DC
-
Hmm.. ob es nun ANSI-C ist, weiß ich nicht, aber
das hier funktioniert:#include <stdio.h> #include <conio.h> main() { char txt[20]; int a; for (a=0;a<10;a++) { txt[a]=getch(); printf("%c",txt[a]); } printf("%s\n",txt); }
Gruß,
DCJoo, hab gerade nachgelesen, daß es nicht Ansi ist und auch
Systemabhängig.
naja, aber trotzdem ne feine Sache..
-
ansi c ist nicht c64. direkt auf den tastaturpuffer zugreifen kannst du unter windows oder unix wohl eher nicht.
such dir ein OS raus, dann sieh, ob du in der faq fuendig wirst.
-
Ne das ganze soll schon plattformübergreifend sein. Also gibt es da keine Möglichkeit ausser eine fremde lib zu verwenden?
-
sag ich doch.
-
Hat der Moderator immer recht?
-
noe. aber mit ansi c bekommst du keine pufferung oder nichtpufferung garantiert. also solltest du darauf auch nicht bauen. wenn du schon text-guis bastelst, dann nimm auch libraries, die darauf spezialisiert sind (ncurses, improved console, ...)
-
Es geht ja nicht um ne textgui. Es geht im Prinzip darum ( wie beim Telnet ) das was beim Server eingegeben wurde auf den client zu übertragen. Einen Echo-Server haben wir schon laufen, allerdings wird da die nachricht logischerweise erst gesendet, wenn enter gedrückt wird. Wir wollen das jetzt auf jedes Zeichen erweitern.
-
ein telnet client uebertraegt ungepuffert.
-
ja und wie kriege ich das hin? Ich kriege ja die eingabe nicht einmal ungepuffert hin. Das ist ja das Problem.