[SOLVED] getline verhält sich seltsam...



  • YASC schrieb:

    Laut meinem gcc gibt es kein getline, laut www.cppreference.com auch nicht, in C.

    Ach ja, stimmt, getline gehört nicht so richtig zu ANSI C, sondern stammt von GNU, das hatte ich vergessen zu erwähnen. 🙂
    Ich benutz das nur gern, weil das auch den Speicher selbst verwalten kann, was ich recht praktisch finde, wenn man von der Tastatur einliest und nicht weiss, wie lang der String wird.

    @hohesC: Hast recht, das fflush(stdin) funktioniert nicht, das hab ich auch nochmal hier:
    http://www.pronix.de/pronix-790.html gefunden (und ausprobiert hab ichs auch).

    Von da hab ich auch das Makro

    #define my_flush() while(getchar() != '\n')
    

    , das so ziemlich das gleiche tut wie fflush(stdin), aber funktioniert. 😉
    Damit reicht jetzt auch scanf("%d",&g) , statt scanf("%d\n",&g) .

    Wenn ich das vor das getline() setze, klappt alles wunderbar.

    danke an alle,

    Morph



  • hohesC schrieb:

    Warum man kein fflush(stdin); benutzen sollte

    ich habe nicht zu fflush(stdin) sondern zu fflush(stdout) geraten.



  • Konfusius schrieb:

    YASC schrieb:

    Laut meinem gcc gibt es kein getline, laut www.cppreference.com auch nicht in C

    getline() gibts unter unix. allerdings bin ich da nicht so fit...

    die ursache deines problems ist wohl, daß getline() im gegensatz zu scanf() den stdout-stream nicht flusht. setze also vor getline() ein fflush(stdout).

    weil das auch so viel Sinn machen würde!
    Hast es schnell abgeändert du n00b!

    mfg hohesC



  • Morph01 schrieb:

    Von da hab ich auch das Makro

    #define my_flush() while(getchar() != '\n')
    

    , das so ziemlich das gleiche tut wie fflush(stdin), aber funktioniert. 😉
    Damit reicht jetzt auch scanf("%d",&g) , statt scanf("%d\n",&g) .

    Wenn ich das vor das getline() setze, klappt alles wunderbar.

    das klappt nur deshalb wunderbar, weil die meisten ansi-c-bibliotheken beim lesen von stdin automatisch stdout flushen. die einfachste und kompatibelste methode ist fflush(sdtout).



  • hohesC schrieb:

    weil das auch so viel Sinn machen würde!
    Hast es schnell abgeändert du n00b!

    😕

    mein edit bestand lediglich darin, den zweiten absatz mit dem fflush() hinzuzufügen. "schnell abgeändert" hab ich nichts.

    im übrigen ist fflush(stdout) die standard-methode um die ausgabe bei printf() ohne new-line zu erzwingen. ich dachte bisher, daß jeder nicht-noob das wüßte.



  • im übrigen ist fflush(stdout) die standard-methode um die ausgabe bei printf() ohne new-line zu erzwingen. ich dachte bisher, daß jeder nicht-noob das wüßte.

    hmmmm.... es war die ganze Zeit nicht von fflush(stdout); die rede! wir hatten es von stdin und das hast du in deinem Post schnell zu stdout gemacht!

    aber red dich ruhig raus 😃
    [edit]dazu geb ich keinen Kommentar mehr ab! 🙄 [/edit]



  • vielleicht haben sich auch nur deine weißen mäuse schnell verkrümelt 😃

    ich will ja keinen streit, aber wenn du es darauf anlegst...



  • ich weiß nicht ob ich dich richtig verstanden habe, aber mE ist in diesem thread davon die rede, wie sich das seltsame ausgabeverhalten des codes von Morph01 vermeiden läßt. dies ist mE mit fflush(stdout) möglich. daß ihr die ganze zeit von fflush(stdin) geredet habt, heißt nicht, daß ich das thema verfehlt hätte.



  • Konfusius schrieb:

    Morph01 schrieb:

    Von da hab ich auch das Makro

    #define my_flush() while(getchar() != '\n')
    

    , das so ziemlich das gleiche tut wie fflush(stdin), aber funktioniert. 😉
    Damit reicht jetzt auch scanf("%d",&g) , statt scanf("%d\n",&g) .

    Wenn ich das vor das getline() setze, klappt alles wunderbar.

    das klappt nur deshalb wunderbar, weil die meisten ansi-c-bibliotheken beim lesen von stdin automatisch stdout flushen. die einfachste und kompatibelste methode ist fflush(sdtout).

    Also, fflush(stdout) bringt den gleichen Effekt wie fflush(stdin), nämlich garkeinen. Seltsam ist das ja schon....



  • doch, es gibt nen unterschied.

    fflush(stdout) schreibt alles im output buffer in die datei
    fflush(stdin) ist ein fehler
    eine ausgabe mit \n flusht automatisch, eine ohne umbruch nicht

    siehe http://www.eskimo.com/~scs/C-faq/q12.26.html



  • daß fflush(stdout) keinen effekt hat, kann ich mir nicht vorstellen. hast du fflush(stdout) auch wirklich unmittelbar nach printf("String :") eingefügt?

    printf("String :"); fflush(stdout); /* hier einfügen */
    getline(&str,&n,stdin);
    

    wenn du es wirklich so gemacht hast und die ausgabe dann immer noch durcheinandergewürfelt ist, dann bin ich mit meinem latein am ende 😞


Anmelden zum Antworten