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
:
#include <iostream> using namespace std; int main() { cout << "Hello World!"; //wypis danych return 0; }
A informacje do programu wczytujemy za pośrednictwem instrukcji cin
:
#include <iostream> using namespace std; int main() { int liczba; cout << "Podaj liczbę:\n"; cin >> liczba; //wczytywanie liczby z klawiatury return 0; }
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
#include <stdio.h> int main() { printf("Hello World!"); //wypisujemy dane return 0; }
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:
#include <stdio.h> int main() { int liczba = 5; printf("W zmiennej typu int, mamy zapisaną liczbę: %d.", liczba); return 0; }
Do oznaczeń typu %d
przejdę później, a teraz zobaczmy inny przykład użycia instrukcji printf:
#include <stdio.h> int main() { int liczba = 5; printf("W zmiennej typu int, mamy zapisaną liczbę: %d. Liczba ta to %d.", liczba, liczba); return 0; }
Oraz
#include <stdio.h> #include <string> int main() { int liczba = 5; std::string tekst = "Hello!"; printf("W zmiennej typu int, mamy zapisaną liczbę: %d. Liczba ta to %d.\n", 20, 5); printf("Jakaś liczba: %d.\n", liczba); printf("%s\n", tekst.c_str()); //wypisze "Hello!" printf("%s World!", tekst.c_str()); return 0; }
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 %
:
#include <stdio.h> int main() { printf("%%"); //wypisze "%" return 0; }
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:
#include <stdio.h> int main() { int liczba; float liczba2; scanf("%d", &liczba); scanf("%f", &liczba2); scanf("%d %f", &liczba, &liczba2); //wczytywanie dwóch liczb na raz return 0; }
Przykład wczytywania zmiennych typu long long
:
#include <stdio.h> #include <inttypes.h> int main() { unsigned long long int liczba; scanf("%llu", &liczba); printf("%llu ", liczba); return 0; }
Przykład wczytywania danych „znak po znaku”:
#include <iostream> using namespace std; int main() { cout << "Podaj jakiś wyraz (o długości 5 znaków)... \n"; char tab[5]; scanf("%s", tab); //wczytywanie pojedynczych znaków do tablicy //UWAGA: Nie podajemy w tym wypadku referencji cout << "Podany wyraz: \n"; for(int i = 0;i<5;i++) cout << tab[i]; return 0; }
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.
Dzięki za pomoc, idealne przed laboratoriami żeby sobie przypomnieć troszkę bo cały czas się cout’a/cin’a używało : )
Nie ma za co !!
Mam kłopot. Używam scanf wpisuje 5, a potem printf każe wypisać tą zmienną,a on wypisuje 4755464.
DLACZEGO ?
Tak na pierwszy rzut oka, to „4755464” może być po prostu adresem do pamięci, możesz pokazać ten fragment kodu?
#include
#include
using namespace std;
int n;
int main()
{
printf(„Hello world!rn”);
printf(„%$$$$$$rn”);
scanf(„%d”, &n);
printf(„%d”, &n);
return 0;
}
Przepraszam, że tak późno ale nie miałem czasu.
Zrób tak jak w przykładzie czyli printf(„%d”, n);