Alternative scanf-Lösung, die Leertasten überließt



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


Anmelden zum Antworten