This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
dydaktyka:cprog:faq [2015/10/16 14:39] pkleczek [Funkcja scanf() nie czeka na wpisanie przeze mnie danych] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== FAQ ====== | ||
- | ===== Podczas budowania programu otrzymuję błąd "ld.exe||cannot open output file bin\Debug\[...].exe Permission denied|" - co robić? ===== | ||
- | |||
- | 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'' :-) | ||
- | |||
- | ===== Funkcja scanf() nie czeka na wpisanie przeze mnie danych ===== | ||
- | |||
- | 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: | ||
- | <code c buffer_problem.c> | ||
- | #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; | ||
- | } | ||
- | </code> | ||
- | Co zostało wypisane? Jakiemu znakowi odpowiada wyświetlony kod [[https://pl.wikipedia.org/wiki/ASCII|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 [[http://www.cplusplus.com/reference/cstdio/getchar/|getchar()]]: | ||
- | <code c> | ||
- | while (getchar() != '\n'); | ||
- | </code> | ||
- | ===== Dlaczego debugger nie zatrzymuje się na breakpointach? ===== | ||
- | |||
- | Problem może być spowodowany spacjami w ścieżce do projektu ([[http://wiki.codeblocks.org/index.php?title=Debugging_with_Code::Blocks#Path_with_spaces|zobacz tu]]). |