[C] Funkcja scanf wczytuje samoistnie znak


(K Ilak) #1

Witam, podczas działania niżej przedstawionego kodu, program nie czeka na wpisanie literki przez użytkownika (WERS 92), ale samoistnie przechodzi dalej, podając, jakoby znk2==(klawisz Enter).

W jaki sposób można tego uniknąć?

znk=getch();
	switch(znk)
	{
		case '1' : 
	{
		j=0;
		printf("Wpisz liczbe: ");
		scanf("%d", &dec);
		char *l_binarna;
		l_binarna=DECtoBIN(dec);
		for (i=0; i<strlen(l_binarna); i++)
		{
			if (l_binarna[i]!='0') break;
		}
		
		for (j=i; j<strlen(l_binarna); j++)
		{
		printf("%c", l_binarna[j]);
		}
		
		printf("\nCzy zapisac do pliku? (t/n): ");
		scanf("%c", &znk2);
		
		if ((znk2=='t') || (znk2=='T')) printf("\nOdpowiedz twierdzaca");
		
	break;
	}

Pozdrawiam


(Drobok) #2

Uzyj funkcji getch(), albo spróbuj %c%c


(K Ilak) #3

getch() znam, ale chodzi o zatwierdzenie enterem, po %c%c program sie krzaczy.


(Drobok) #4

scanf(" %c", &c);


(Feanordev) #5

http://stackoverflow.com/questions/19794268/scanf-reading-enter-key

Po wpisaniu wartości dla scanf konsola dodaje \n (enter) do bufforu przez co kolejny scanf %c automatycznie go ładuje.

 

Edit:

Spacja w " %c" tak jak @drobok napisał powinna pomóc.


(K Ilak) #6

Działa ze spacją, dziękuję serdecznie. Właśnie tak myslałem, że to przez ów bufor. Szukałem jakiejś instrukcji nie wiem, zwalniającej pamięć bufora, ale nic nie znalazłem. 


(Drobok) #7

fflush(stdin)


(nintyfan) #8

Uruchamiasz program pod Windows. Pod Windows znakiem nowej linii jest \r\h lub \n\r, więc może stąd konsola myśli, że nacisnąłeś dwa razy enter.


(K Ilak) #9

Okej, opcja fflush świetnie spełnia swoją funkcję.