Arbeitsweise von scanf
-
Hallo, wie genau geht scanf vor?
Meine Lehrerin meinte, scanf würde mit getchar arbeiten,
dass kann ich mir nicht vorstellen.
-
Ist nirgends spezifiziert. Also habt ihr beide unrecht :p
-
Hi,
scanf aus der glibc:
int scanf (const char *format, ...) { va_list arg; int done; va_start (arg, format); #ifdef USE_IN_LIBIO done = INTUSE(_IO_vfscanf) (stdin, format, arg, NULL); #else done = vfscanf (stdin, format, arg); #endif va_end (arg); return done; }
Es wird auf jeden Fall kein getchar () genutzt um scanf zu implementieren.
mfg
v R
-
Original erstellt von virtuell Realisticer:
**Es wird auf jeden Fall kein getchar () genutzt um scanf zu implementieren.
**wie kannst du da so sicher sein??
-
Ist nirgends spezifiziert. Also habt ihr beide unrecht :p
Also ich denke mal, dass getchar nicht genutzt wird und zwar aus folgendem Grund:
getchar () erwartet ein abschliessendes Return und liefert mir nur ein Zeichen,
wenn ich scanf () aufrufe, dann gebe ich aber einen ganzen String ein und
beende die Eingabe mit einem Einzelnen Return. Bei getchar muesste ich ja dann
mehrmals Return druecken.Oder gibt es en Weg, scanf () mit getchar () zu implementieren? Wuesste jetzt mal
grad keinenIst aber nur MHO
mfg
v R
-
wie kannst du da so sicher sein??
Meinte bezogen auf die Implementation der glibc, sorry kam falsch rueber.
mfg
v R
-
Original erstellt von virtuell Realisticer:
**Meinte bezogen auf die Implementation der glibc, sorry kam falsch rueber.
**dann solltest du uns aber auch mal
vfscanf
zeigen.
da scanf über vfscanf implementiert ist. was ja auch logisch ist.
-
Original erstellt von virtuell Realisticer:
getchar () erwartet ein abschliessendes ReturnNein, tut es nicht.
Oder gibt es en Weg, scanf () mit getchar () zu implementieren? Wuesste jetzt mal grad keinen
Man ruft solange getchar auf, bis man den ganzen Format-String abgearbeitet hat?
[edit]Quoting will gelernt sein[/edit]
[ Dieser Beitrag wurde am 07.03.2003 um 14:57 Uhr von SG1 editiert. ]
-
vr: Mißverständnis deinerseits. getchar erwartet nicht, dass in irgendeiner Weise Enter gedrückt wird. getchar liest das nächste Zeichen aus dem Strom stdin.
gehen wir von diesem Programm aus:
int c; while ((c = getchar()) != EOF) { putchar(c); fflush(stdout); }
Wenn du eine Zeile eingibst, passiert normalerweise erstmal noch nichts, da Betriebssysteme Eingaben von interaktiven Geräten zeilenweise abliefern. Wenn du jetzt Enter drückst, kommt die ganze Zeile in einem Rutsch: Die Schleife wird so oft durchlaufen, wie die Zeile Zeichen enthält. Dann blockiert getchar() wieder, bis die nächste Zeile reinkommt (oder EOF signalisiert wird.) Nicht nach jedem einzelnen Zeichen!
-
Beitrag editiert, war mein Fehler...
[ Dieser Beitrag wurde am 07.03.2003 um 15:43 Uhr von virtuell Realisticer editiert. ]
-
Hallo? Erde an virtuell Realisticer, alles klar da oben?
-
Sorry, sollte eigentlich nicht gepostet worden.
Mißverständnis deinerseits. getchar erwartet nicht, dass in irgendeiner Weise Enter gedrückt wird. getchar liest das nächste Zeichen aus dem Strom stdin.
Ja, stimmt. Ich bloedian haett ma lieber in die Hilfe schauen sollen, als hier
direkt mist zu erzaehlen, manchmal sind die Finger schneller als es Gehirnmfg
v R[ Dieser Beitrag wurde am 07.03.2003 um 15:43 Uhr von virtuell Realisticer editiert. ]
-
Arbeitet scanf den nun mit getchar(), ja oder nein?
Dem Beitrag von "SG1" zu folge ist es also immerhin möglich.
-
Original erstellt von alpha21:
Arbeitet scanf den nun mit getchar(), ja oder nein?
Dem Beitrag von "SG1" zu folge ist es also immerhin möglich.darf ich Bashar zitieren?
Ist nirgends spezifiziert.<
was ist an dieser aussage unklar?
-
dein lehrer sollte leiber sagen das es mögliche ist mit getchar() zu implementieren
-
ok, dann werd ich ihr sagen, das es >>nirgends spezifiziert<<
ist. Ist zwar etwas merkwürdig, das man sowas nicht herausbekommen kann,
aber wenn selbst die Leute in diesem Forum nichts genaueres wissen,
werd' ich es wohl nie erfahren.thx
-
Such dir einen Compiler wo der Source mit bei ist und guck ihn dir an. Jedem Compilerhersteller ist es selbst überlassen, wie er das implementiert. Hauptsache es funktioniert nachher wie es soll.
-
Original erstellt von alpha21:
Ist zwar etwas merkwürdig, das man sowas nicht herausbekommen kanneinfacheres beispiel als scanf:
ein simples strcpychar* strcpy(char* trg, const char* src) { while(*trg++=*src++); return trg; } char* strcpy(char* trg, const char* src) { memcpy(trg,src,strlen(src)); return trg; } char* strcpy(char* trg, const char* src) { size_t len=strlen(src); while(len>=0) { trg[len]=src[len]; --len; } return trg; } char* strcpy(char* trg, const char* src) { return strncpy(trg,src,strlen(src)); }
das sind alles (soweit ich jetzt keine fehler reingemacht habe) mögliche standardkonforme implementation von strcpy.
und strcpy kopiert lediglich einen string. jetzt stell dir mal vor wieviel mehr möglichkeiten es bei IO Funktionen gibt.
-
An dieser Stelle hätte ich nochmal ein paar Fragen, die nicht direkt etwas mit dem Topic zu tun haben:
Stehen getch() und kbhit() in der conio.h und sind dieses Borland speziefische
Funktionen, bzw. ist die conio.h von Borland?Wo genau liegt der Unterschied zwischen getch() und getchar() ?
-
Original erstellt von alpha21:
**Stehen getch() und kbhit() in der conio.h und sind dieses Borland speziefische
Funktionen, bzw. ist die conio.h von Borland?
**Sie stehen in der conio.h und sind Konsolen Spezifische Funktionen.
Also bezogen auf die DOS Konsole in Windows.Kein Compiler MUSS sie haben, aber fast alle Windows Compiler haben sie.
Wo genau liegt der Unterschied zwischen getch() und getchar() ?
getchar() ist standard, getch() nicht.
getch() liest exakt ein Zeichen aus - und zwar ungepuffert.
getchar() ist das selbe wie fgetc(stdin). Es liest ein Zeichen aus dem puffer.
Resultat:
bei getchar() kann man einen ganzen String angeben, wovon getchar das erste Zeichen liest und den Rest im Puffer stehen lässt.
bei getch() kann man nur 1 Zeichen angeben, dieses wird nicht am Bildschirm ausgegeben. (sonst müsste man getche() verwenden)getch() liest also direkt aus dem Stream, während getchar() aus dem Puffer liest.
-
falsch, getch liest von der Tastatur, nicht vom Stream. Und vom Stream lesen und vom Buffer lesen ist (bei gepufferter Eingabe) gleichbedeutend, nur auf verschiedenen Abstraktionsebenen.