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, ]>odaiicj przez użytkownika:
#include <stdio.h>
int main ()
int liczba ■ 0;
printf ("Podaj liczbę: ");
scanf ("/Cd", ftliczba);
printf ("/Cd*7,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 fimkcja 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 8$ podobne takie jak przy printf(), czyli scanf (7,i, ftliczba) ; wczytuje liczbę typu int. scanf (ŹCf, ftliczba); - liczbę typu f loat. a scanf (%s, tablica.znakóv); ciąg znaków. Ale czemu w tym ostatnim przypadku nie ma etki? Otóż, gdy ]x>dajemy jako argument do funkcji wyrażenie typu tablicowego zamieniane jest ono automatycznie na aelres 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 <stdio.h>
int main(void)
char tablica[100]; /* 1 */
scanf("7,s", tablica); /* 2 */ return 0;
Robi on niewiele. W linijce 1 deklarujemy tablicę 100 znaków czyli mogącą przechować napis długości 99 znaków. Nie przejmuj się jeżeli nie do końca to wszystko