This is an old revision of the document!
Spróbuj wyczyścić projekt (wybierz z menu Build → Clean) i zbudować go ponownie.
Czyszczenie projektu powoduje usunięcie wszystkich plików z folderu
bin\Debug
! Upewnij się, że nie zależy Ci na poprzedniej wersji pliku .exe
W pewnych sytuacjach może zdarzyć się, że funkcja scanf()
pobierze dane “automatycznie” – z pozoru nie czekając na wpisanie czegoś przez użytkownika.
Aby zobaczyć, o co chodzi, uruchom poniższy program i postępuj zgodnie z jego poleceniami:
#include <stdio.h> int main() { int n; char c; printf("Podaj liczbe calkowita i nacisnij <ENTER>: "); scanf("%d", &n); printf("Napisz jeden znak i nacisnij <ENTER>: "); scanf("%c", &c); printf("\n\n"); printf("Wpisana liczba: %d\n", n); printf("Wpisany znak: %c (ASCII = %d)\n", c, c); return 0; }
Co zostało wypisane? Jakiemu znakowi odpowiada wyświetlony kod ASCII? Jak sądzisz, dlaczego tak się stało?
Odpowiedź brzmi: Gdy użytkownik wpisuje dane na klawiaturze i wciska klawisz ENTER, dane umieszczane są w buforze – takiej “przechowalni bagażu”. Dopiero z tego miejsca są odczytywane przez funkcję scanf()
, przy czym funkcja ta odczytuje (i usuwa z bufora) tylko tyle danych, ile potrzebuje. W tym przypadku po wpisaniu 5
i naciśnięciu ENTER w buforze umieszczane są dwa znaki – 5
oraz \n
(odpowiadający ENTER-owi). Pierwsze wywołanie funkcji scanf()
oczekuje liczby, zatem odczytuje (i usuwa z bufora) znak 5
, ale pozostawia znak \n
. Drugie wywołanie scanf()
oczekuje znaku i… znajduje go – to ten pozostały w buforze znak nowej linii! Jednym ze sposobów na rozwiązanie tego problemu jest umieszczenie po pierwszym wywołaniu scanf()
takiej instrukcji, korzystającej z funkcji getchar():
while (getchar() != '\n');
Problem może być spowodowany spacjami w ścieżce do projektu (zobacz tu).