Arbeitsweise von scanf



  • 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 Return

    Nein, 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 Gehirn 😞

    mfg
    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 kann

    einfacheres beispiel als scanf:
    ein simples strcpy

    char* 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.


Anmelden zum Antworten