Problem mit einem Beispiel



  • Hi, ich habe da ein Problem mit einem Programm. Man kann den Namen von dem Artikel nicht eingeben. Was ist da falsch?

    // Eine Struktur für eine Lagerverwaltung
    #include <stdio.h>
    #include <string.h>
    
    struct lagerverwaltung
    	{
    		long artikelnummer;
    		char artikelbezeichnung[100];
    		int anz_artikel;
    	};
    
    int count = 0;
    
    int main()
    {
    	struct lagerverwaltung artikel[100];	
    	int abfrage, nummer;
    
    	do {
    		printf("\n\tL a g e r v e r w a l t u n g\n\n");
    		printf("<1> Neuen Artikel eingeben\n");
    		printf("<2> Bestimmten Artikel ausgeben\n");
    		printf("<3> Ende\n\n");
    		printf("Ihre Wahl : < >\b\b");
    		scanf("%d",&abfrage);
    		fflush(stdin);
    
    		switch(abfrage)
    		{
    
    			default: 
    			{
    				printf("Falsche Eingabe!\n\n");
    				break;
    			}
    
    			case 1: {
    				artikel[count].artikelnummer=count;
    				printf("Artikelbezeichnung  : \n");
    				fgets(artikel[count].artikelbezeichnung, 100, stdin);
    				printf("Anzahl der Artikel  : ");
    				scanf("%d",&artikel[count].anz_artikel);
    				fflush(stdin);
    				printf("\nDaten wurden aufgenommen!\n");
    				printf("Artikelnummer lautet %d\n\n",count);
    				count++;
    			break; }
    
    			case 2: {
    				printf("Artikelnummer  :");
    				scanf("%d",&nummer);
    				if( (nummer >= count) || (nummer < 0) )
    					printf("\nKein Eintrag dazu!\n\n");
    				else
    				{
    					printf("\n\nArtikelnummer : %ld\n", artikel[nummer].artikelnummer);
    					printf("Artikel       : %s", artikel[nummer].artikelbezeichnung);
    					printf("Anzahl        : %d\n", artikel[nummer].anz_artikel);
    				}
    					break; }
    
    		}
    	} while(abfrage != 3);
    	return 0;
    }
    


  • Vielleicht mal das default nach den cases setzen?!



  • Ne, das wars nicht. Also bei mir funktioniert das so.....



  • Jo, bei mir geht das Programm auch. Ich vermute eher, dass das Problem darin liegt, dass fflush() für stdin nicht definiert ist (siehe auch FAQ) und bei Dir (Alexander88) undefiniertes Verhalten verursacht.
    Ersetze mal die Teile mit scanf() und fflush(stdin) durch

    char buffer[100];
    ...
    fgets(buffer, 100, stdin);
    sscanf(buffer, "%d", &abfrage); //oder eine andere Variable
    

    und guck, ob es dann geht.
    Wenn es dann gehen sollte, liegt das Problem wohl darin, dass noch irgendwelche Zeichen bei der Abfrage mit scanf() im Inputbuffer übrigbleiben, die dann den Programmablauf stören.



  • moin

    ich vermute mal, das es am fflush(stdin) liegt. ersetzt das mal gegen

    freopen("/dev/tty", "r", stdin);

    sofern du linux einsetzt.

    ps: bin aber selbst noch c noob, also keine gewähr 😉

    Gruß HL



  • Also, es geht nicht um die Zeilen mit scanf sondern nur um die Zeile mit fgets. Der Rest geht ja nur die Eingabe über fgets nicht.



  • Ja, das ist schon klar. Aber ich vermute eben, dass bei der Eingabe mit scanf() etwas im Imputbuffer übrig bleibt (z.B. newline, oder sowas) und das dann als Eingabe für fgets() gewertet wird.
    Wenn ich bei mir das fflush(stdin) rausnehme, hat das Programm bei mir das gleiche Problem wie bei Dir - vermutlich macht fflush(stdin) bei Dir einfach gar nichts, weil es nicht Standardkonform ist, das ist dann so, als stünde es gar nicht da.
    Deswegen habe ich die scanf() Aufrufe alle mit fgets()+sscanf() ersetzt, um dieses Problem zu umgehen. Dann lief das Programm wieder bei mir, und zwar auch ohne fflush().



  • Du hast recht. Wenn ich die Zeile mit fgets lösche, hat das keine Auswirkung auf das Programm.


Anmelden zum Antworten