[Novize] scanf("%c") Char einlesen beendet Programm



  • #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <stdbool.h>
    #include <ctype.h>
    
    int main(void)
    {
    	char another_game = 'Y';
    
    	bool correct = true;
    
    	int counter = 0;
    
    	int sequence_length = 0;
    	time_t seed = 0;
    	int number = 0;
    
    	printf("\nTo Play Simple Simon, ");
    	printf("watch the screen for a sequence of digits.");
    	printf("\nWatch carefully, as the digits are only displayed"
    											" for a second!");
    	printf("\nThe computer will remove them, and then prompt you ");
    	printf("to enter the same sequence.");
    	printf("\nGood Luck!\nPress Enter to play\n");
    	scanf("%c", &another_game);
    
    	do
    	{
    		correct = true;
    		counter = 0;
    		sequence_length = 2;
    
    		while(correct)
    		{
    			sequence_length += counter++%3 == 0;
    
    			seed = time(NULL);
    
    			srand((unsigned int)seed);
    			int i;
    			for(i = 1;i <= sequence_length; i++)
    				printf("%d ", rand()%10);
    
    			srand((unsigned int)seed);
    			for(i= 1; i <= sequence_length; i++)
    			{
    				scanf("%d", &number);
    				if(number != rand()%10)
    				{
    					correct = false;
    					break;
    				}
    			}
    			printf("%s\n", correct ? "Correct!" : "Wrong!");
    		}
    
    		printf("\nDo you want to play again (y/n)? ");
    		scanf("%c", &another_game);
    	}while(toupper(another_game) == 'Y');	
    
    	return 0;
    }
    

    Mir ist es jetzt zum zweiten mal aufgefallen das sobald ich scanf("%c",&var_adress) erreiche das Programm immer beendet wird.
    Ich habe garnicht die Möglichkeit etwas einzugeben.

    Wenn ihr den obigen Code compiled habt ihr das selbe Problem? Oder liegt das bei Mir und meinem GNU Compiler. Manchmal klappt es, manchmal nicht - ich sehe den Fehler nicht !

    mfg Charlie



  • Nach jedem scanf immer Eingabepuffer löschen, da noch mind. 1 '\n' dort übrig ist, was folgende scanf-Aufrufe stört.



  • Du kannst auch ein Leerzeichen vor das %c setzen.

    scanf(" %c", &another_game);
    

    Das Problem ist allerdings, dass alles andere als 'Y' das Programm beendet.
    Einmal zwei Tasten gedrückt und das wars.

    Auch reicht das srand einmal am Programmanfang.
    Das Programm wird nicht zufälliger, wenn du srand für jedes Spiel neu aufrufst.



  • scanf lässt die Zeichen, die nicht zum Formatspecifier passen im Eingabestrom.

    Von deinem scanf("%d",...) in Zeile 48 bleibt also ein '\n' im Eingabestrom stehen.
    Dies liest du dann in Zeile 60 ein.

    Normalerweise werden Whitespace (Leerzeichen, Tabulatoren, '\n', '\r') dabei überlesen.
    Allerdings nicht bei %c, da scanf nicht wissen kann ob du gerade diese Zeichen einlesen willst.

    Das Leerzeichen im Formatstring besagt jetzt "Überlese alle Whitespace".

    Das funktioniert alles soweit gut, bis der Nutzer eine Fehleingabe macht.


Anmelden zum Antworten