Eingabepuffer leeren unter Linux



  • Hi leute, hab schon google gefragt und das forum durchsucht, hab aber nichts brauchbares gefunden.

    Wie leert ihr denn den eingabepuffer? fflush()... ist ja eigentlich gar nicht dafür zuständig, oder?
    dann das mit dem while( getchar() != '\n' ) ist auch so ne sache, weil man ja zwei mal enter drücken muss, und klappt auch nicht so gut!
    dann hab ich noch fpurge() entdeckt, damit kann ich auch nichts anfangen, außer wenn ihr es mir erklärt vielleicht, bzw. wie man es einfügt. glaube linux unterstützt fpurge nicht?!

    es gibt zwar viele sachen die man findet bei google, aber nichts wirklich brauchbares.

    bitte um hilfe



  • Hi,
    das mit der while Schleife funktioniert schon richtig, es darf aber erst nach dem Aufruf von scanf oder getchar benutzt werden, weil sonst auf eine Eingabe gewartet wird, was man ja eingetlich nicht will.

    Unabhängig von irgend einem Funktionsaufruf kannst du dir auch die Zeilen

    (stdin,NULL,_IONBF,0); 
        setvbuf(stdin,NULL,_IOFBF,BUFSIZ);
    

    in eine Funktion packen.



  • ok, hab ne funktion erstellt, funktioniert aber nicht, ich mach sicher etwas falsch!

    hier einmal das programm:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "dvd_struktur.h"
    #include "clear.h"
    #define MAX 50
    
    void eingabe ( void );
    
    /* Statt system("PAUSE") */
    void wait ()
    {
        setvbuf(stdin,NULL,_IONBF,0);
        setvbuf(stdin,NULL,_IOFBF,BUFSIZ);
        getchar();
    } 
    
    void clear_puff ( void )
    {
    	(stdin,NULL,_IONBF,0);
        setvbuf(stdin,NULL,_IOFBF,BUFSIZ);
    }
    
    int auswahl ( void )
    {
    	int auswahl = 0;
    	printf("Wollen Sie noch eine DVD eingeben? (ja:0,nein:1)\nIhre Wahl: ");
    	scanf("%1d", &auswahl);
    	clear_puff ();
    
    	switch(auswahl) {
    	case(0): auswahl = 0; return auswahl ; break;
    	case(1): auswahl = 1; return auswahl ; break;
    	default: return printf("Falsche Eingabe\n"); break;
    	}
    }
    
    void add_list_elem ( )
    {
    	struct DVD* zeiger = anfang;
    	int again = 0;
    	char titel[MAX];
    	char sendung[MAX];
    	char aufnahmedatum[MAX];
    	char dauer[MAX];
    	do
    	{
    		if ( again == 0 ) {
    					clear ();
    					printf("Titel: ");
    					fgets ( titel, MAX, stdin );
    					printf("Sendung: ");
    					fgets ( sendung, MAX, stdin );
    					printf("Aufnahmedatum: ");
    					fgets ( aufnahmedatum, MAX, stdin );
    					printf("Dauer: ");
    					fgets ( dauer, MAX, stdin );
    
    					if ( ( zeiger = ( struct DVD* ) malloc (sizeof(struct DVD)) )  == NULL ) {
    						fprintf(stderr, "Speicherplatzmangel");
    						return;
    					}
    					else 
    					{
    						strcpy(zeiger->titel, titel);
    						strcpy(zeiger->sendung, sendung);
    						strcpy(zeiger->aufnahmedatum, aufnahmedatum);
    						strcpy(zeiger->dauer, dauer);
    						again = auswahl ();
    					}
    		}
    		zeiger->next = anfang;
    		anfang = zeiger;
    	}while ( again == 0 );
    }
    
    void ausgabe ( void )
    {
    	struct DVD* zeiger = NULL;
    	clear();
    	zeiger = anfang;
    
    	if ( anfang == NULL )
    		fprintf ( stderr, "Noch kein Element vorhanden\n\n" );
    	else {
    		while ( zeiger != NULL ) {
    			printf("Titel: %s\nSendung: %s\nAufnahmedatum: %s\nDauer: %s\n\n\n", zeiger->titel, zeiger->sendung, zeiger->aufnahmedatum, zeiger->dauer);
    			zeiger = zeiger->next;
    		}
    	}
    	wait();
    }
    
    void loeschen ( struct DVD* zeiger, struct DVD* zeiger1 )
    {
    	if ( zeiger != anfang)
    			zeiger1->next = zeiger->next;
    	else
    			anfang = zeiger->next;
    	free(zeiger);
    	printf("DVD erfolgreich geloescht\n");
    	wait();
    }
    
    void aendern ( struct DVD* zeiger )
    {
    		printf("Titel: ");
    	    fgets ( zeiger->titel, MAX, stdin );
    		printf("Sendung: ");
    		fgets ( zeiger->sendung, MAX, stdin );
    		printf("Aufnahmedatum: ");
    		fgets ( zeiger->aufnahmedatum, MAX, stdin );
    		printf("Dauer: ");
    		fgets ( zeiger->dauer, MAX, stdin );
    }
    void searched_elem_print ( struct DVD* zeiger )
    {
    	printf("Titel: %s\nSendung: %s\nAufnahmedatum: %s\nDauer: %s\n\n\n", zeiger->titel, zeiger->sendung, zeiger->aufnahmedatum, zeiger->dauer);
    	wait();
    }
    
    void gefunden ( struct DVD* zeiger, struct DVD* zeiger1 )
    {
        int auswahl = 0;
    
    	while (1) {
    		printf("DVD gefunden\n");
    		printf("1: ausgeben\n");
    		printf("2: aendern\n");
    		printf("3: loeschen\n");
    		printf("4: zurueck ins Hauptmenue\n");
    		scanf("%1d", &auswahl);
    		clear_puff ();
    
    		switch(auswahl) {
    		case (1): searched_elem_print ( zeiger ); break;
    		case (2): aendern ( zeiger ); break;
    		case (3): loeschen ( zeiger, zeiger1 ); break;
    		case(4): return; break;
    		default: printf("Falsche Eingabe\n"); break;
    		}
    	}
    }
    
    void suche ( void )
    {
    	char titel_such[MAX];
    	struct DVD* zeiger = anfang, * zeiger1;
    	fgets ( titel_such, MAX, stdin );
    
    	while ( zeiger != NULL && strcmp(zeiger->titel, titel_such) )
    	{
    		zeiger1 = zeiger;
    		zeiger = zeiger->next;
    	}
    	gefunden ( zeiger, zeiger1 );
    }
    
    void name_such ( char* txt )
    {
    	printf("%s", txt);
    	suche ();
    }
    
    void begin_control ( void )
    {
    	if ( anfang == NULL ) {
    		fprintf ( stderr, "Noch kein Element vorhanden\n\n" );
    		return;
    	}
    	else
    		name_such ( "Geben Sie den Titel ein, den Sie suchen wollen:\n" ); 
    }
    int main ( void )
    {
    	while(1){
    		int auswahl = 0;
    		clear();
    		printf("DVD- Verwaltung\n");
    		printf("1: Eingabe\n");
    		printf("2: Ausgabe\n");
    		printf("3: Suche\n");
    		scanf("%d", &auswahl);
    		clear_puff ();
    
    		switch(auswahl) {
    		case(1): add_list_elem(); break;
    		case(2): ausgabe(); break;
    		case(3): begin_control(); break;
    		}
    	}
    	return 0;
    }
    


  • Was du willst ist doch genau deine wait() funktion, nur ohne dem getchar();.
    Das Macht genau das richtige. Bei dem Code von Big Brother fehlt ein Teil, nämlich das setvbuf... das sollte aber schon auffallen 😉



  • jepp, stimmt

    funzt nur nicht bei mir 😕
    sind die funktionsaufrufe an der richtigen stelle?

    gehts bei euch?



  • Da ist mir was weggerutscht, muss heißen:
    setvbuf(stdin,NULL,_IONBF,0);



  • was mach ich da falsch?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "dvd_struktur.h"
    #include "clear.h"
    #define MAX 50
    
    void eingabe ( void );
    
    /* Statt system("PAUSE") */
    void wait ()
    {
        setvbuf(stdin,NULL,_IONBF,0);
        setvbuf(stdin,NULL,_IOFBF,BUFSIZ);
        getchar();
    } 
    
    void clear_puff ( void )
    {
    	setvbuf(stdin,NULL,_IONBF,0);
        setvbuf(stdin,NULL,_IOFBF,BUFSIZ);
    }
    
    int auswahl ( void )
    {
    	int auswahl = 0;
    	printf("Wollen Sie noch eine DVD eingeben? (ja:0,nein:1)\nIhre Wahl: ");
    	scanf("%1d", &auswahl);
    	clear_puff ();
    
    	switch(auswahl) {
    	case(0): auswahl = 0; return auswahl ; break;
    	case(1): auswahl = 1; return auswahl ; break;
    	default: return printf("Falsche Eingabe\n"); break;
    	}
    }
    
    void add_list_elem ( )
    {
    	struct DVD* zeiger = anfang;
    	int again = 0;
    	char titel[MAX];
    	char sendung[MAX];
    	char aufnahmedatum[MAX];
    	char dauer[MAX];
    	do
    	{
    		if ( again == 0 ) {
    					clear ();
    					printf("Titel: ");
    					fgets ( titel, MAX, stdin );
    					printf("Sendung: ");
    					fgets ( sendung, MAX, stdin );
    					printf("Aufnahmedatum: ");
    					fgets ( aufnahmedatum, MAX, stdin );
    					printf("Dauer: ");
    					fgets ( dauer, MAX, stdin );
    
    					if ( ( zeiger = ( struct DVD* ) malloc (sizeof(struct DVD)) )  == NULL ) {
    						fprintf(stderr, "Speicherplatzmangel");
    						return;
    					}
    					else 
    					{
    						strcpy(zeiger->titel, titel);
    						strcpy(zeiger->sendung, sendung);
    						strcpy(zeiger->aufnahmedatum, aufnahmedatum);
    						strcpy(zeiger->dauer, dauer);
    						again = auswahl ();
    					}
    		}
    		zeiger->next = anfang;
    		anfang = zeiger;
    	}while ( again == 0 );
    }
    
    void ausgabe ( void )
    {
    	struct DVD* zeiger = NULL;
    	clear();
    	zeiger = anfang;
    
    	if ( anfang == NULL )
    		fprintf ( stderr, "Noch kein Element vorhanden\n\n" );
    	else {
    		while ( zeiger != NULL ) {
    			printf("Titel: %s\nSendung: %s\nAufnahmedatum: %s\nDauer: %s\n\n\n", zeiger->titel, zeiger->sendung, zeiger->aufnahmedatum, zeiger->dauer);
    			zeiger = zeiger->next;
    		}
    	}
    	wait();
    }
    
    void loeschen ( struct DVD* zeiger, struct DVD* zeiger1 )
    {
    	if ( zeiger != anfang)
    			zeiger1->next = zeiger->next;
    	else
    			anfang = zeiger->next;
    	free(zeiger);
    	printf("DVD erfolgreich geloescht\n");
    	wait();
    }
    
    void aendern ( struct DVD* zeiger )
    {
    		printf("Titel: ");
    	    fgets ( zeiger->titel, MAX, stdin );
    		printf("Sendung: ");
    		fgets ( zeiger->sendung, MAX, stdin );
    		printf("Aufnahmedatum: ");
    		fgets ( zeiger->aufnahmedatum, MAX, stdin );
    		printf("Dauer: ");
    		fgets ( zeiger->dauer, MAX, stdin );
    }
    void searched_elem_print ( struct DVD* zeiger )
    {
    	printf("Titel: %s\nSendung: %s\nAufnahmedatum: %s\nDauer: %s\n\n\n", zeiger->titel, zeiger->sendung, zeiger->aufnahmedatum, zeiger->dauer);
    	wait();
    }
    
    void gefunden ( struct DVD* zeiger, struct DVD* zeiger1 )
    {
        int auswahl = 0;
    
    	while (1) {
    		printf("DVD gefunden\n");
    		printf("1: ausgeben\n");
    		printf("2: aendern\n");
    		printf("3: loeschen\n");
    		printf("4: zurueck ins Hauptmenue\n");
    		scanf("%1d", &auswahl);
    		clear_puff ();
    
    		switch(auswahl) {
    		case (1): searched_elem_print ( zeiger ); break;
    		case (2): aendern ( zeiger ); break;
    		case (3): loeschen ( zeiger, zeiger1 ); break;
    		case(4): return; break;
    		default: printf("Falsche Eingabe\n"); break;
    		}
    	}
    }
    
    void suche ( void )
    {
    	char titel_such[MAX];
    	struct DVD* zeiger = anfang, * zeiger1;
    	fgets ( titel_such, MAX, stdin );
    
    	while ( zeiger != NULL && strcmp(zeiger->titel, titel_such) )
    	{
    		zeiger1 = zeiger;
    		zeiger = zeiger->next;
    	}
    	gefunden ( zeiger, zeiger1 );
    }
    
    void name_such ( char* txt )
    {
    	printf("%s", txt);
    	suche ();
    }
    
    void begin_control ( void )
    {
    	if ( anfang == NULL ) {
    		fprintf ( stderr, "Noch kein Element vorhanden\n\n" );
    		return;
    	}
    	else
    		name_such ( "Geben Sie den Titel ein, den Sie suchen wollen:\n" ); 
    }
    int main ( void )
    {
    	while(1){
    		int auswahl = 0;
    		clear();
    		printf("DVD- Verwaltung\n");
    		printf("1: Eingabe\n");
    		printf("2: Ausgabe\n");
    		printf("3: Suche\n");
    		scanf("%d", &auswahl);
    		clear_puff ();
    
    		switch(auswahl) {
    		case(1): add_list_elem(); break;
    		case(2): ausgabe(); break;
    		case(3): begin_control(); break;
    		}
    	}
    	return 0;
    }
    


  • naja wenn ich while( getchar() != '\n' ); nach jedem blöden scanf() mache, dann geht es, außer wenn ich das Element suche und dann anzeige, dann hat es wieder nen blöden Fehler, würde mich freuen wenn mir einer hilft 😉

    mich regt das scanf() schon ziemlich auf, sscanf() der so hab ich auch schon versucht...

    gibt es sonst irgendeinen Ersatz der problemlos funktioniert?


Anmelden zum Antworten