Wczytywanie i wypisywanie danych w C++ za pomocą Scanf i Printf – szybsza alternatywa dla cout oraz cin

Wczytywanie i wypisywanie danych na ekranie komputera to podstawowa umiejętność przy pisaniu programów komputerowych. Na ten temat miałem już okazję pisać w artykułach: „Piszemy pierwszy program w C++” oraz „Obsługa zmiennych w C++„. Po przeczytaniu tych dwóch publikacji dowiedzieliście się, między innymi, że w C++ dane na ekranie komputera wypisujemy za pośrednictwem instrukcji cout:

A informacje do programu wczytujemy za pośrednictwem instrukcji cin:

Instrukcje te oczywiście sprawdzają się bardzo dobrze, ale czasami mogą nie wystarczyć lub po prostu specyfikacja naszej aplikacji wymaga maksymalnej optymalizacji. Należy tutaj zwrócić uwagę, że printf oraz scanf działają znacznie szybciej niż ich podane wyżej odpowiedniki oraz dostarczają więcej możliwości programiście.

Początkowo używanie tych dwóch funkcji może wydawać się nieco trudne ale jak już się dokładnie zapoznamy z ich specyfikacją, to nie powinno być żadnego problemu, a ich zastosowanie czasami może bardzo pomóc.

Kiedyś mądrzy ludzie napisali (czy powiedzieli? – nie ważne), że programowania można nauczyć się tylko programując w takim razie przejdźmy od razu do przykładu.

printf

Powyżej zademonstrowałem najprostszy przykład użycia funkcji printf do wypisania danych – w naszym przypadku był to tekst „Hello World!„. Oczywiście instrukcja ta ma znacznie więcej możliwości. Głównie chodzi o to, że w dowolnym miejscu danego tekstu, możemy wstawić na przykład zawartość jakiejś zmiennej:

Do oznaczeń typu %d przejdę później, a teraz zobaczmy inny przykład użycia instrukcji printf:

Oraz

Jak widać wypisywanie danych za pomocą instrukcji printf daje bardzo dużo możliwości w porównaniu do tradycyjnego cout. Oczywiście poza liczbami i tekstem, możemy również wstawiać dane innych typów:

Specyfikator Opis
%d lub %i Liczba całkowita ze znakiem (system dziesiętny) np. int
%f Liczba rzeczywista (system dziesiętny) np. float
%u Liczba całkowita bez znaku (system dziesiętny)
%e Liczba w notacji naukowej – ze znakiem e (małe litery)
%E Liczba w notacji naukowej – ze znakiem E (duże litery)
%g Liczba rzeczywista w notacji %f lub %e
%G Liczba rzeczywista w notacji %f lub %E
%o Liczba w systemie ósemkowym
%x Liczba w systemie szesnastkowym (małe litery)
%X Liczba w systemie szesnastkowym (duże litery)
%c Znak np. zmienne typu char
%s Łańcuch znaków zakończony „\0„, np. zmienne typu string
%p Adres pamięci

Wypisywanie znaku specjalnego %:

scanf

Instrukcja scanf działa praktycznie tak samo jak printf z tą różnicą, że nie wypisuje ona żadnych danych, a po prostu wczytuje. Zobaczmy na przykład:

Przykład wczytywania zmiennych typu long long:

Przykład wczytywania danych „znak po znaku”:

Więcej na temat wczytywania danych za pomocą funkcji scanf() „znak po znaku” możecie przeczytać w artykule: „Wczytywanie “znak po znaku” cyfr oraz wyrazów w C++„.

Tabela specyfikatorów dla scanf wygląda tak:

Specyfikator Opis
%d lub %i Liczba całkowita ze znakiem (system dziesiętny) np. int
%f Liczba rzeczywista (system dziesiętny) np. float
%u Liczba całkowita bez znaku (system dziesiętny)
%e Liczba w notacji naukowej – ze znakiem e (małe litery)
%E Liczba w notacji naukowej – ze znakiem E (duże litery)
%g Liczba rzeczywista w notacji %f lub %e
%G Liczba rzeczywista w notacji %f lub %E
%o Liczba w systemie ósemkowym
%x Liczba w systemie szesnastkowym (małe litery)
%X Liczba w systemie szesnastkowym (duże litery)
%c Znak np. zmienne typu char

Przy wczytywaniu łańcuchów znaków (string) lepiej zastosować inną technikę np. getline().

Fot. (ilustracja wpisu): Dominic Alves, CC BY 2.0.

Przeczytaj również

, , , , , , ,

Dodaj komentarz

guest
7 komentarzy
Najstarsze
Najnowsze Najlepiej oceniane
Inline Feedbacks
View all comments
Milosz
Milosz
16 stycznia 2017 12:47

Dzięki za pomoc, idealne przed laboratoriami żeby sobie przypomnieć troszkę bo cały czas się cout’a/cin’a używało : )

Dennis
Dennis
24 stycznia 2020 17:18
Reply to  Milosz

Nie ma za co !!

Piotr Wiktor Turowski
Piotr Wiktor Turowski
4 marca 2018 09:56

Mam kłopot. Używam scanf wpisuje 5, a potem printf każe wypisać tą zmienną,a on wypisuje 4755464.
DLACZEGO ?

lukas124
4 marca 2018 10:29

Tak na pierwszy rzut oka, to „4755464” może być po prostu adresem do pamięci, możesz pokazać ten fragment kodu?

Piotr Wiktor Turowski
Piotr Wiktor Turowski
6 marca 2018 18:10
Reply to  lukas124

#include
#include
using namespace std;
int n;
int main()
{
printf(„Hello world!rn”);
printf(„%$$$$$$rn”);
scanf(„%d”, &n);
printf(„%d”, &n);
return 0;
}

Piotr Wiktor Turowski
Piotr Wiktor Turowski
6 marca 2018 18:10

Przepraszam, że tak późno ale nie miałem czasu.

lukas124
6 marca 2018 19:11

Zrób tak jak w przykładzie czyli printf(„%d”, n);