→Funkcja scanf(): inne sposoby
(→Funkcja scanf(): inne sposoby) |
|||
printf ("Podaj liczbę: ");
scanf ("%d", &liczba);
printf ("%
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 [[C/Wskaźniki|Wskaźniki]].
Można tego uniknąć stosując tablicę:
<source lang="c">
Oznaczenia są podobne takie jak przy printf(), czyli <tt>scanf("%i", &liczba);</tt> wczytuje liczbę typu <tt>int</tt>, <tt>scanf("%f", &liczba);</tt> – liczbę typu <tt>float</tt>, a <tt>scanf("%s", tablica_znaków);</tt> 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 automatycznie na adres pierwszego elementu tablicy. Będzie to dokładniej opisane w rozdziale poświęconym [[C/Wskaźniki|wskaźnikom]].▼
#include <stdio.h>
int main(void)
{
int liczba[1];
scanf("%d", liczba);
printf("%dx%d=%d\n", liczba[0], liczba[0], liczba[0]*liczba[0]);
return 0;
}
</source>
▲Oznaczenia są podobne takie jak przy printf(), czyli <tt>scanf("%i", &liczba);</tt> wczytuje liczbę typu <tt>int</tt>, <tt>scanf("%f", &liczba);</tt> – liczbę typu <tt>float</tt>, a <tt>scanf("%s", tablica_znaków);</tt> ciąg znaków. Ale czemu w tym ostatnim przypadku (i w przykładzie z jednoelementową tablicą) nie ma etki? Otóż, gdy podajemy jako argument do funkcji wyrażenie typu tablicowego zamieniane jest ono automatycznie na adres pierwszego elementu tablicy. Będzie to dokładniej opisane w rozdziale poświęconym [[C/Wskaźniki|wskaźnikom]].
{{Uwaga|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 <tt>-Wformat</tt>.}}
int main(void)
{
int n[1];
while (scanf("%d",
{
printf("%d\n", n[0]*n[0]*n[0]);
}
return 0;
int main(void)
{
int
while (scanf("%d %d",
{
printf("%d\n",
}
return 0;
|