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

Usunięta treść Dodana treść
Mina86 (dyskusja | edycje)
→‎Funkcja scanf(): opis zwracanej wartości
Linia 169:
}
 
Funkcja scanf() zwraca liczbę poprawnie wczytanych zmiennych lub EOF jeżeli nie ma już danych w strumieniu lub nastąpił błąd. Załóżmy dla przykładu, że chcemy stworzyć program, który odczytuje po kolei liczby i wypisuje ich 3 potęgi. W pewnym momencie dane się kończą lub jest wprowadzana niepoprawna dana i wówczas nasz program powinien zakończyć działanie. Aby to zrobić należy sprawdzać wartość zwracaną przez funkcję scanf() w warunku pętli:
{{TODO|Opisać zwracaną wartość}}
 
#include <stdio.h>
int main(void)
{
int n;
while (scanf("%d", &n)==1) {
printf("%d\n", n*n*n);
}
return 0;
}
 
Podobnie możemy napisać program, który wczytuje po dwie liczby i je sumuje:
 
#include <stdio.h>
int main(void)
{
int a, b;
while (scanf("%d %d", &a, &b)==2) {
printf("%d\n", a+b);
}
return 0;
}
 
Rozpatrzmy teraz trochę bardziej skomplikowany przykład. Otóż, ponownie jak poprzednio nasz program będzie wypisywał 3 potęgę podanej liczby, ale tym razem musi ignorować błędne dane (tzn. pomijać ciągi znaków, które nie są liczbami) i kończyć działanie tylko w momencie, gdy nastąpi błąd odczytu lub koniec pliku<ref>Jak rozróżniać te dwa zdarzenia dowiesz się w rozdziale [[C/Czytanie_i_pisanie_do_plików|Czytanie i pisanie do plików]].</ref>.
 
#include <stdio.h>
int main(void)
{
int result, n;
do {
result = scanf("%d", &n);
if (result==1) {
printf("%d\n", n*n*n);
} else if (!result) { /* !result to to samo co result==0 */
char c;
/* odczytuj po jednym znaku aż do napotkania spacji
lub znaku przejścia do nowej linii */
result = scanf("%c", &c);
while (result==1 && c!=' ' && c!='\n') {
result = scanf("%c", &c);
}
}
} while (result!=EOF);
return 0;
}
 
Zastanówmy się przez chwilę co się dzieje w programie. Najpierw wywoływana jest funkcja scanf() i następuje próba odczytu liczby typu int. Jeżeli funkcja zwróciła 1 to liczba została poprawnie odczytana i następuje wypisanie jej trzeciej potęgi. Jeżeli funkcja zwróciła 0 to na wejściu były jakieś dane, które nie wyglądały jak liczba. W tej sytuacji następuje odczyt danych znak po znaku<ref>Zamiast używać funkcji scanf() można tutaj użyć funkcji getchar() opisanej niżej.</ref> aż do momentu, gdy funkcja zwróci EOF (co oznacza, że nie ma już więcej danych lub nastąpił błąd) lub odczytany znak to spacja lub przejście do nowej linii<ref>Lepiej zapewne byłoby użyć funkcji isspace() z pliku nagłówkowego ctype.h.</ref>. W ten sposób niepoprawnie wpisana dana jest omijana. Pętla główna wykonuje się tak długo jak długo funkcja scanf() nie zwróci wartości EOF.
 
[[C/scanf|Więcej o funkcji scanf()]]