Alternative scanf-Lösung, die Leertasten überließt
-
Tag liebe Commuinty
ich bin dabei einen ganze simplen Chat zuschreiben, und beim Eintippen einer Message gibt er mir immer nur das letzte Wort des Textes aus, das liegt am scanf, wie ich später gemerkt habe. Dann habe ich mal gegoogelt und dort wurden mir zwei Lösungen angeboten, fgetc und gets. Beide bringen mir aber nicht das Ergebnis, so wie ich es gerne hätte, da sie mich das der Funktion werfen
Gibt es da noch eine andere Lösung?
-
versuchs doch mal mit fgets() - das ließt eine zeilenweise bis zeilenvorschub oder eof
-
Sorry, ich habe mich oben verschrieben, ich meinte ich habe fgets schon benutzt, und das wirft mich aus meiner FUnktion ...
#include<stdio.h> #include<string.h> void main_chat(char *nick, char *enick); void new_typing(char *nick, char *enick, char *chat, char *nich); int main() { char nick[20]; char enick[20]; printf("<----------------- ~ Name auswaehlen ~------------------>\n"); scanf("%s", nick); strcpy(enick, nick); strcat(nick, ": "); main_chat(nick, enick); } void main_chat(char *nick, char *enick) { char chat[200]; char nich[220] = "Willkommen im Chat\n"; int main_aktion; do{ system("clear"); printf("--------------------- ~ Dein Chat ~ -------------------->\n"); printf("%s", nich); printf("--- ~ Dein Chatname ~ ---------------------------------->\n"); printf("> Dein Chatname: %s\n", enick); printf("--- ~ Dein Menue ~ ------------------------------------->\n"); printf("> Refresh [1] | Nachricht verfassen [2] | Ausloggen [0]\n"); printf("--- ~ Administration ~ --------------------------------->\n"); printf("> Chat-Log loeschen [9]\n"); printf("----------------------- ~ Auswahl ~ -------------------->\n"); scanf("%d", &main_aktion); if(main_aktion == 2){ new_typing(nick, enick, chat, nich); }else if(main_aktion == 1){ main_chat(nick,enick); }else main_aktion = 0; }while(main_aktion != 0); } void new_typing(char *nick, char *enick, char *chat, char *nich) { printf("--------------------- ~ Dein Chat ~ -------------------->\n"); fgets(chat, 41, stdin); strcat(nick, chat); strcpy(nich, nick); strcat(nich, "\n"); strcpy(nick, enick); strcat(nick, ": "); }
Hier, kompilier das mal ^^
-
das problem bei dir wird sein, dass das \n mit in den stream gelesen wird und dadurch dieses verhalten erzeugt. wenn du fgets() verwendest, dann gibts in der faq (hier: http://c-plusplus.net/forum/viewtopic-var-t-is-39349.html) nen lösungsansatz dafür.
damit sollte es klappen
-
ich versteh nichts davon, habs mir gerade angeguckt
hast du icq ode msn?^^
-
als beispiel für deinen quelltext:
void flushStream() { int c = 0; while( ( c = getchar() ) != EOF && c != '\n' ); } void new_typing(char *nick, char *enick, char *chat, char *nich) { printf("--------------------- ~ Dein Chat ~ -------------------->\n"); flushStream(); fgets(chat, 41, stdin); puts( "weiter mit Enter..." ); flushStream(); /* usw. */
das machst du immer dort, wo du eine zeile einlesen willst
-
als ergebnis wollte ich es so haben
--------------------- ~ Dein Chat ~ --------------------> Willkommen im Chat --- ~ Dein Chatname ~ ----------------------------------> > Dein Chatname: Nick --- ~ Dein Menue ~ -------------------------------------> > Refresh [1] | Nachricht verfassen [2] | Ausloggen [0] --- ~ Administration ~ ---------------------------------> > Chat-Log loeschen [9] ----------------------- ~ Auswahl ~ --------------------> 2 ---------------------------------------------------------------------------- --------------------- ~ Nachricht ~ --------------------> Hallo wie geht es dir? ---------------------------------------------------------------------------- --------------------- ~ Dein Chat ~ --------------------> Nick: Hallo wie geht es dir? --- ~ Dein Chatname ~ ----------------------------------> > Dein Chatname: Nick --- ~ Dein Menue ~ -------------------------------------> > Refresh [1] | Nachricht verfassen [2] | Ausloggen [0] --- ~ Administration ~ ---------------------------------> > Chat-Log loeschen [9] ----------------------- ~ Auswahl ~ -------------------->
Leider kommt was völlig anderes raus, wenn ich einen der oben genannten lösungen benutze, nur nicht bei scanf. Dann jedoch gibt er nur das letzte Wort aus ...
-
Ich verwende immer diese Fkt:
char *get_next_line(FILE *fp) { int c, buff_len, str_len; char *buff, *tmp; buff = NULL; buff_len = str_len = 0; for(c = fgetc(fp); (c != '\n' && c != EOF) ; c = fgetc(fp)) { str_len++; if(str_len >= buff_len) { buff_len = 2*str_len; tmp = realloc(buff, buff_len); if(tmp == NULL) return buff; buff = tmp; } buff[str_len - 1] = c; buff[str_len] = 0; } return buff; }
-
Ahh ich danke dir
Wenn du mir das mit eigenen Worten ebend erklären könntest wäre ich dir sehr sehr sehr dankbar, was ich eig. schon bin
-
wie wär's, wenn du versuchst, selber den Code zu verstehen und wenn es eine Stelle gibt, die du nicht verstehst, dann fragst du hier nach? So lernst du sogar was dabei.
-
Dieses flushStream checke ich aber nicht, was soll ich denn machen? oO
ERklärung wäre echt lieb
-
Das mit dem fflush Dingens ist so:
In dem FAQ Beitrag wird erklärt, warum man die Funktion fflush() nicht mit dem stdin Argument aufrufen soll; warum man also nicht fflush(stdin); schreiben sollte.
Hat aber so direkt nix mit deinem Problem zu tun.Gruß,
e.b.