scanf Funktion wird durch gets übersprungen



  • Hallo,

    Ich habe ein grosses Problem. Wir verwenden in der Ausbildung das Programm
    Microsoft Visual Studio c++.

    Momentan arbeiten wir mit Funktionen ( also noch Grundkenntniss erlernen ) und haben alle ein grosses Problem. Wenn der Befehl "gets" nach "scanf" kommt
    wird die Funktin des "scanf" komplett vom Programm missachtet, ergo er liest nichts mehr ein, da die Auswahl schon vom Programm getroffen wurde.
    ( zu sehen in Programmabschnitt 13 und 14 ).

    Über eure Hilfe wäre meine Schule+ Lehrer sehr dankbar 🙂

    MFG: Johannes "Rigo" H.

    #include <stdio.h>
    
    void Programm2()
    {
    	int x,y;
    
    	printf("\n\n\nDies ist ein Programm zur Berechnung von 2 Zahlen.\n\n");
    	printf("--------------------------------------------------\n");
    	printf("Bitte geben Sie die erste Zahl ein:");
    	scanf("%i",&x);
    	printf("Bitte geben Sie die zweite Zahl ein:");
    	scanf("%i",&y);
    	printf("Das Ergebnis betraegt %i",x*y);
    }
    
    void Programm3()
    {
    	float x,y,z;
    
    	printf("\n\n\n\tProgramm zur Volumenberechnung eines Quaders");
    	printf("\n\n\t----------------------------------------------------");
    	printf("\n\n\tGeben Sie die Laenge <in Meter> des Quaders ein:  ");
    	scanf("%f",&x);
    	printf("\n\n\tGeben Sie die Breite <in Meter> des Quaders ein:  ");
    	scanf("%f",&y);
    	printf("\n\n\tGeben Sie die Tiefe <in Meter> des Quaders ein:   ");
    	scanf("%f",&z);
    	printf("\n\n\tDas Volumen des Quaders betraegt      %.2f Kubikmeter",x*y*z);
    	printf("\n\n\t----------------------------------------------------\n\n\n\n");
    }
    
    void Programm4()
    {
    	int auswahl;
    	float x,y,z;
    
    	printf("\n\n\nProgramm zur Berechnung des Volumens eines Quaders oder eines Zylinders");
    	printf("\n\n***********************************************************************");
    	printf("\n\nWelches Volumen soll berechnet werden?");
    	printf("\n\nQuadervolumen <bitte 1 eingeben >");
    	printf("\nZylindervolumen <bitte 2 eingeben >");
    	printf("\n");
    	scanf("%i",&auswahl);
    
    	if (auswahl==1)
    		{
    		printf("\n\nGeben Sie die Laenge des Quaders ein: ");
    		scanf("%f",&x);
    		printf("\n\nGeben Sie die Breite des Quaders ein: ");
    		scanf("%f",&y);
    		printf("\n\nGeben Sie die Tiefe des Quaders ein:  ");
    		scanf("%f",&z);
    		printf("\n\n\nDas Volumen des Quaders betraegt:     %f",x*y*z);
    		printf("\n\n\n");
    		}
    
    	if (auswahl==2)
    		{
    		printf("\n\nGeben Sie den Durchmesser des Zylinders ein: ");
    		scanf("%f",&x);
    		printf("\n\nGeben Sie die Hoehe des Zylinders ein: ");
    		scanf("%f",&y);
    		printf("\n\nDas Volumen des Zylinders betraegt:    %f,");
    		}
    }
    
    void Programm5()
    {
    }
    
    void Programm6()
    {
    	int x, a;	  
    	float z;
    	z=1;
    
    	printf ("\n\n\n\tProgramm zur Berechnung der Fakultaet einer Zahl\n");
    	printf ("\t------------------------------------------------\n\n");
    
    	printf ("\tGeben Sie die Zahl <Zahl <= 10> ein, deren Fakultaet\n");
    	printf ("\tberechnet werden soll: ");
    
    	scanf ("%i", &x);
    
    		for (a = 1; a <= x; a++);
    		{
    		z = a * z;
    		}
    
    	printf ("\n\n\tFakultaet der Zahl %i = %.0f \n\n\n\n\n",x ,z);
    }
    
    void Programm7()
    {
    }
    
    void Programm8()
    {
    }
    
    void Programm9()
    {
    }
    
    void Programm10()
    {
    }
    
    void Programm11()
    {
    }
    
    void Programm12()
    {
    }
    
    void Programm13()
    {
    	int i,x,y,f,g;
    	char satz[99];
    	x=0;
    	f=0;
    	printf("\n Bitte Satz eingeben\n>");
    	gets (satz);
    	printf("\n");
    	for(i=0;satz[i]!='\0';i++)
    	{ if (satz[i]==101 || satz[i]==69)
    			{
    			x=x+1;
    			}
    	  if (satz[i]==65 || satz[i]==97)
    			{
    			f=f+1;
    			}
    	}
    
        y=x*100/i;
    	g=f*100/i;
    	printf("So viele 'e' sind im Text enthalten: %i\n",x);
    	printf("So viele 'a' sind im Text enthalten: %i\n",f);
    	printf("Prozentualer Anteil 'e': %i%%",y);
    	printf("Prozentualer Anteil 'a': %i%%",g);
        printf("\n");
    	printf("\n");
    	printf("\n");
    	printf("\n");
    
    }
    
    void Programm14()
    {
    	int i,x,y,j;
    	char satz[99],c;
    	x=0;
    	j=0;
    	printf("\nBitte einen Satz eingeben\n>");
    	gets(satz);
    	printf("\n");
    
    		for(x=0;satz[x]!='\0';x++)
    		{}
    		y=x/2;
    			for(i=x-1;i>=y;i--)
    			{
    			c=satz[i];
    			satz[i]=satz[j];
    			satz[j]=c;
    			j++;
    			}
    			printf("%s",satz);
    }
    
    void Programm15()
    {
    }
    
    void Programm16()
    {
    	int a1,a2,a3,b1,b2,b3,c1,c2,c3,d1,d2,d3,ErgebnisD,ErgebnisDx,ErgebnisDy,ErgebnisDz,x,y,z;
    
    	printf("\n\tDieses Programm loest ihre 3 Gleichungen mit Hilfe");
    	printf("\n\t          des Verfahren des Sarus");
    	printf("\n\n\n\tBitte geben Sie jetzt den 1.Faktor der 1.Gleichung ein:");
    	scanf("%i",&a1);
    	printf("\n\tBitte geben Sie jetzt den 2.Faktor der 1.Gleichung ein:");
    	scanf("%i",&b1);
    	printf("\n\tBitte geben Sie jetzt den 3.Faktor der 1.Gleichung ein:");
    	scanf("%i",&c1);
    	printf("\n\tBitte geben Sie jetzt das Ergebnis der 1.Gleichung ein:");
    	scanf("%i",&d1);
    	printf("\n\tBitte geben Sie jetzt den 1.Faktor der 2.Gleichung ein:");
    	scanf("%i",&a2);
    	printf("\n\tBitte geben Sie jetzt den 2.Faktor der 2.Gleichung ein:");
    	scanf("%i",&b2);
    	printf("\n\tBitte geben Sie jetzt den 3.Faktor der 2.Gleichung ein:");
    	scanf("%i",&c2);
    	printf("\n\tBitte geben Sie jetzt das Ergebnis der 2.Gleichung ein:");
    	scanf("%i",&d2);
    	printf("\n\tBitte geben Sie jetzt den 1.Faktor der 3.Gleichung ein:");
    	scanf("%i",&a3);
    	printf("\n\tBitte geben Sie jetzt den 2.Faktor der 3.Gleichung ein:");
    	scanf("%i",&b3);
    	printf("\n\tBitte geben Sie jetzt den 3.Faktor der 3.Gleichung ein:");
    	scanf("%i",&c3);
    	printf("\n\tBitte geben Sie jetzt das Ergebnis der 3.Gleichung ein:");
    	scanf("%i",&d3);
    
    	printf("\n\n");
    	ErgebnisD=a1*b2*c3+b1*c2*a3+c1*a2*b3-a3*b2*c1-b3*c2*a1-c3*a2*b1;
    	ErgebnisDx=d1*b2*c3+b1*c2*d3+c1*d2*b3-d3*b2*c1-b3*c2*d1-c3*d2*b1;
    	ErgebnisDy=a1*d2*c3+d1*c2*a3+c1*a2*d3-a3*d2*c1-d3*c2*a1-c3*a2*d1;
    	ErgebnisDz=a1*b2*d3+b1*d2*a3+d1*a2*b3-a3*b2*d1-b3*d2*a1-d3*a2*b1;
    
    	x=ErgebnisDx/ErgebnisD;
    	y=ErgebnisDy/ErgebnisD;
    	z=ErgebnisDz/ErgebnisD;
    
    	printf("\n x = %i",x);
    	printf("\n y = %i",y);
    	printf("\n z = %i",z);
    	printf("\n\n\n");
    
    	printf("\n\n");
    	printf("\nErgebnisD=%i",ErgebnisD);
    	printf("\nErgebnisDx=%i",ErgebnisDx);
    	printf("\nErgebnisDy=%i",ErgebnisDy);
    	printf("\nErgebnisDz=%i",ErgebnisDz);
    	printf("\n\n");
    }
    
    void Programm17()
    {
    }
    
    void main (void)
    
    { 
    	int Auswahl,Neustart;
    
    	do
    	{
    		printf("\n\tDies ist ein Kompendium aller im Unterricht erstellten Programme");
    		printf("\n\t----------------------------------------------------------------");
    		printf("\n\n\n\nWelches Programm wollen Sie starten lassen?");
    		printf("\n\n\n 1) Das erste C-Programm");
    		printf("\n 2) Ein Programm zur Berechnung von 2 Zahlen");
    		printf("\n 3) Programm zur Volumenberechnung eines Quaders");
    		printf("\n 4) Programm zur Berechnung des Volumens eines Quaders oder eines Zylinders");
    		printf("\n 5) Programm zur Summen und Mittelwertberechnung einer Zahlenfolge");
    		printf("\n 6) Programm zur Berechnung der Fakultaet einer Zahl");
    		printf("\n 7) Programm zur Ermittlung der Schaltjahre von 19XX bis 20XX");
    		printf("\n 8) Programm zur Ermittlung des 'Groessten Gemeinsamen Teilers'");
    		printf("\n 9) Programm zur Ausgabe von ASCII-Zeichen zwischen 49 und 127");
    		printf("\n10) Programm zum Thema Datenfelder Aufgabe1");
    		printf("\n11) Programm zum Thema Datenfelder Ausgabe2");
    		printf("\n12) Programm zum Thema Datenfelder Aufgabe3");
    		printf("\n13) Programm zur Errechnung des prozentualen Anteils des 'e' in einem beliebigen Satz");
    		printf("\n14) Programm zur Rueckwaertsausgabe eines Satzes");
    		printf("\n15) Programm zum Einlesen eines Satzes und der Ausgabe eines jeden Wortes in einer neuen Zeile");
    		printf("\n16) Programm zur Berechnung der Spaltensummen einer 3x3 Matrix");
    		printf("\n17) Programm zur Ermittlung von geraden Zahlen in einer 4x4 Matrix");
    		printf("\n\n\n Auswahl(1-17):");
    
    		scanf("%i",&Auswahl);
    
    		switch (Auswahl)
    		{
    		case 1:
    			{
    			printf("\n\n\nDies ist ein erstes C-Programm.\n\n");
    			printf("Wie Sie sehen kann der Befehl (die Funktion) 'printf'");
    			printf("nicht nur Texte drucken,\n");
    			printf("sondern auch rechnen.\n\n");
    			printf("13 * 7 = %i \n\n",13*7);
    			}
    			break;
    
    		case 2:
    			{
    			Programm2();
    			}
    		break;
    
    		case 3:
    			{
    			Programm3();
    			}
    		break;
    
    		case 4:
    			{
    			Programm4();
    			}	
    		break;
    
    		case 5:
    			{
    			Programm5();
    			}	
    		break;
    
    		case 6:
    			{
    			Programm6();
    			}
    		break;	
    
    		case 7:
    			{
    			Programm7();
    			}
    		break;	
    
    		case 8:
    			{
    			Programm8();
    			}
    		break;	
    
    		case 9:
    			{
    			Programm9();
    			}
    		break;	
    
    		case 10:
    			{
    			Programm10();
    			}
    		break;	
    
    		case 11:
    			{
    			Programm11();
    			}
    		break;	
    
    		case 12:
    			{
    			Programm12();
    			}
    		break;	
    
    		case 13:
    			{
    			Programm13();
    			}
    		break;
    
    		case 14:
    			{
    			Programm14();
    			}
    		break;
    
    		case 15:
    			{
    			Programm15();
    			}
    		break;
    
    		case 16:
    			{
    		    Programm16();		
    			}
    		break;
    
    		case 17:
    			{
    		    Programm17();
    			}
    
    		}
    
    		printf("Wollen Sie das Programm neu starten lassen?");
    		printf("\nWenn ja, dann druecken Sie jetzt bitte die 1:");
    		scanf("%i",&Neustart);
    	}
    	while (Neustart == 1);
    
    	printf("\n\n");
    }
    

    <hume>Code-Tags repariert</hume>



  • probier mal nach jedem 'scanf' das:

    while (getchar()!='\n');
    

    (tastaturbuffer entmüllen. vielleicht hilfts)



  • net schrieb:

    probier mal nach jedem 'scanf' das:

    while (getchar()!='\n');
    

    (tastaturbuffer entmüllen. vielleicht hilfts)

    Ja, das ist kreative Programmierung 🙄

    Wenn er den Puffer leeren will, was das Problem sein könnte,
    dann direkt fflush(stdin);
    Und bitte nicht x Seiten Quellcode reinpasten, das liest doch keiner durch 😉

    Devil



  • devil81 schrieb:

    Wenn er den Puffer leeren will, was das Problem sein könnte,
    dann direkt fflush(stdin);

    dass das, was du vorschlägst, nicht immer geht, steht im schäbigsten c-tutorial 😉



  • net schrieb:

    devil81 schrieb:

    Wenn er den Puffer leeren will, was das Problem sein könnte,
    dann direkt fflush(stdin);

    dass das, was du vorschlägst, nicht immer geht, steht im schäbigsten c-tutorial 😉

    Und ? Ich lese keine schäbigen Tuts...
    Bei mir hats bisher immer geklappt 😉



  • Und das "fflush(stdin);" sollte dann wohin geschrieben werden?
    Das mit dem get char funktioniert schonmal einwandfrei, wenn natürlich die kürzere Variante fflush funktioniert wär das auch nicht schlecht 🙂



  • devil81 schrieb:

    Und ? Ich lese keine schäbigen Tuts...

    vielleicht solltest du das mal?

    devil81 schrieb:

    Bei mir hats bisher immer geklappt 😉

    reine glückssache. guckst du: http://www.comeaucomputing.com/techtalk/#flushinput
    btw: 'rewind()' könnt' auch gehen, hab ich mal irgendwo gelesen



  • Also die Glückssache scheint auch bei uns zu funktionieren. Unser Lehrer ist jedoch auch mehr freund der while Funktion s.o. Ein herzliches Dankeschön von mir, meiner Klasse und meinem Lehrer :).

    Nun können wir uns endlich weiter durch c++ quälen 🙂

    Die rewind Funktion erkennt das Programm allerdings als Fehler an, ich habs direkt unter das scanf geschrieben, wenn das allerdings falsch ist bitte sagen, wir probieren jede Möglichkeit gerne durch.

    Je mehr Möglichkeiten desto besser 🙂



  • Cool. Vielleicht solltet ihr eurem Lehrer mal sagen, dass es ersten #include<cstdio> heißt und zweitens C und kein C++ ist?



  • ogiR schrieb:

    Unser Lehrer ist jedoch auch mehr freund der while Funktion s.o. Ein herzliches Dankeschön von mir, meiner Klasse und meinem Lehrer 🙂 ...

    ... Und drittens das void main() _nicht_ zum Standard gehört (weder in C noch in C++ afaik). Außserdem gibt es keine while-Funktionen, genauso wie es keine If-Schleifen gibt. 😉

    Caipi



  • ...und fflush(stdin) undefiniert ist: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39349.html

    EDIT: Ups, stand ja schon da. Naja, nun sollte ers wissen. 🙂



  • Caipi schrieb:

    Außserdem gibt es keine while-Funktionen...

    void While (void)
    {
      printf ("Hello, while\n");     
    }
    

    😕



  • Ich sprach von while-Funktionen. :p

    Caipi


Anmelden zum Antworten