FUNKCJE WEJŚCIA 69 Funkcje wejścia Funkcja scanf() Teraz pomyślmy o sytuacji odwrotnej. Tym razem to użytkownik musi powiedzieć coś programowi. W poniższym przykładzie program podaje kwadrat liczby, podanej przez użytkownika: #include int main () { int liczba = 0; printf ("Podaj liczbę: "); scanf ("%d", &liczba); printf ("%d*%d=%d\n", liczba, liczba, liczba*liczba); return 0; } Zauważyłeś, że w tej funkcji przy zmiennej pojawił się nowy operator — & (etka). Jest on ważny, gdyż bez niego funkcja scanf() nie skopiuje odczytanej wartości liczby do odpowiedniej zmiennej! Właściwie oznacza przekazanie do funkcji adresu zmiennej, by funkcja mogła zmienić jej wartość. Nie musisz teraz rozumieć, jak to się odbywa, wszystko zostanie wyjaśnione w rozdziale Wskaźniki. Oznaczenia sÄ
podobne takie jak przy printf(), czyli scanf(%i, &liczba); wczytu- je liczbÄ typu int, scanf(%f, &liczba); â liczbÄ typu float, a scanf(%s, tablica znaków); ciÄ
g znaków. Ale czemu w tym ostatnim przypadku nie ma etki? Otóż, gdy podajemy jako argument do funkcji wyrażenie typu tablicowego zamieniane jest ono automa- tycznie na adres pierwszego elementu tablicy. BÄdzie to dokÅadniej opisane w rozdziale poÅwiÄconym wskaźnikom. Brak etki jest czÄstym bÅÄdem szczególnie wÅród poczÄ
tkujÄ
cych programistów. Ponieważ funkcja scanf() akceptuje zmiennÄ
liczbÄ argumentów to nawet kompilator może mieÄ kÅopoty z wychwyceniem takich bÅÄdów (konkretnie chodzi o to, że standard nie wymaga od kompilatora wykrywania takich pomyÅek), choÄ kompilator GCC radzi sobie z tym jeżeli podamy mu argument -Wformat. Należy jednak uważaÄ na to ostatnie użycie. Rozważmy na przykÅad poniższy kod: #include int main(void) { char tablica[100]; /* 1 */ scanf("%s", tablica); /* 2 */ return 0; } Robi on niewiele. W linijce 1 deklarujemy tablicÄ 100 znaków czyli mogÄ
cÄ
prze- chowaÄ napis dÅugoÅci 99 znaków. Nie przejmuj siÄ jeżeli nie do koÅca to wszystko
... zobacz całą notatkę
Komentarze użytkowników (0)