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

Usunięta treść Dodana treść
→‎Funkcja scanf(): inne sposoby
Lethern (dyskusja | edycje)
m Wycofano edycje użytkownika 178.42.163.56 (dyskusja). Autor przywróconej wersji to Marcin412.
Linia 152:
printf ("Podaj liczbę: ");
scanf ("%d", &liczba);
printf ("%dxd*%d=%d\n", liczba, liczba, liczba*liczba);
return 0;
}
Linia 158:
 
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>.}}
Linia 203 ⟶ 193:
int main(void)
{
int n[1];
while (scanf("%d", &n)==1)
{
printf("%d\n", n[0]*n[0]*n[0]);
}
return 0;
Linia 218 ⟶ 208:
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;