[SOLVED] getline verhält sich seltsam...
-
Hm, ok, das reine Einlesen klappt so schonmal, danke.
Nur, wenn ich vor dem getline noch einen printf-befehl setze, dann wird zuerst der String eingelesen und dann etwas ausgegeben.
Das Programm von eben, etwas erweitert:#include <stdio.h> int main() { int n=0; int g=0; char *str; str=NULL; printf("Zahl :"); scanf("%d\n",&g); printf("String :"); getline(&str,&n,stdin); printf("%d\n",g); printf("%s\n",str); }
gibt mir statt des erwarteten
Zahl :5 String :HelloWorld 5 HelloWorld
das aus:
Zahl :5 HelloWorld String :5 HelloWorld
Kapier ich nicht
Irgendwer ne idee, warum das passiert?
Morph
PS: Was bedeuten denn die ganzen Zahlen und Buchstaben in deinem Beitrag ?
-
1. Laut meinem gcc gibt es kein getline, laut www.cppreference.com auch nicht, in C
2. Ich habe es so gelöst:#include <stdio.h> int main() { int n=0; int g=0; char str[256]; // Speicher muss vorhanden sein(!) printf("Zahl :"); fgets(str, 256, stdin); // maximal 255 Zeichen von stdin lesen g = atol(str); // str in int konvertieren printf("String :"); fgets(str, 256, stdin); // maximal 255 Zeichen einlesen printf("%d\n",g); printf("%s",str); }
Achtung: fgets lasst das \n noch hinten dran!
Zu den Zahlen und Buchstaben: Dieselbe Nachricht, bloß hexkodiert.
So wie das hier:
312E204C617574206D65696E656D20676363206
7696274206573206B65696E206765746C696E65
2C206C617574207777772E63707072656665726
56E63652E636F6D2061756368206E696368742C
20696E2043(Der erste Punkt)
-
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).
-
Warum man kein fflush(stdin); benutzen sollte:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-284498.htmlmfg hohesC
-
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
-
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