C/Podstawowe procedury wejścia i wyjścia: Różnice pomiędzy wersjami

Przejdź do nawigacji Przejdź do wyszukiwania
m
Wycofano edycje użytkownika 178.42.163.56 (dyskusja). Autor przywróconej wersji to Marcin412.
(→‎Funkcja scanf(): inne sposoby)
m (Wycofano edycje użytkownika 178.42.163.56 (dyskusja). Autor przywróconej wersji to Marcin412.)
printf ("Podaj liczbę: ");
scanf ("%d", &liczba);
printf ("%dxd*%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 [[C/Wskaźniki|Wskaźniki]].
 
Można tego uniknąć stosując tablicę:
Oznaczenia są podobne takie jak przy printf(), czyli <tt>scanf("%i", &liczba);</tt> wczytuje liczbę typu <tt>int</tt>, <tt>scanf("%f", &liczba);</tt> &ndash; 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]].
<source lang="c">
#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> &ndash; 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", &n)==1)
{
printf("%d\n", n[0]*n[0]*n[0]);
}
return 0;
int main(void)
{
int tab[2]a, b;
while (scanf("%d %d", tab&a, tab+2&b)==2)
{
printf("%d\n", tab[0]a+tab[1]b);
}
return 0;
8268

edycji

Menu nawigacyjne