User Tools

Site Tools


dydaktyka:cprog:faq

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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]]). 
dydaktyka/cprog/faq.1444999165.txt.gz · Last modified: 2020/03/25 11:46 (external edit)