Informacje o nowych artykułach oraz akcjach edukacyjnych prosto na Twojej skrzynce e-mail!

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:

SpecyfikatorOpis
%d lub %iLiczba całkowita ze znakiem (system dziesiętny) np. int
%fLiczba rzeczywista (system dziesiętny) np. float
%uLiczba całkowita bez znaku (system dziesiętny)
%eLiczba w notacji naukowej – ze znakiem e (małe litery)
%ELiczba w notacji naukowej – ze znakiem E (duże litery)
%gLiczba rzeczywista w notacji %f lub %e
%GLiczba rzeczywista w notacji %f lub %E
%oLiczba w systemie ósemkowym
%xLiczba w systemie szesnastkowym (małe litery)
%XLiczba w systemie szesnastkowym (duże litery)
%cZnak np. zmienne typu char
%sŁańcuch znaków zakończony „\0„, np. zmienne typu string
%pAdres 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:

SpecyfikatorOpis
%d lub %iLiczba całkowita ze znakiem (system dziesiętny) np. int
%fLiczba rzeczywista (system dziesiętny) np. float
%uLiczba całkowita bez znaku (system dziesiętny)
%eLiczba w notacji naukowej – ze znakiem e (małe litery)
%ELiczba w notacji naukowej – ze znakiem E (duże litery)
%gLiczba rzeczywista w notacji %f lub %e
%GLiczba rzeczywista w notacji %f lub %E
%oLiczba w systemie ósemkowym
%xLiczba w systemie szesnastkowym (małe litery)
%XLiczba w systemie szesnastkowym (duże litery)
%cZnak 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.

Spodobało się?

Jeśli tak, to zarejestruj się do newslettera aby otrzymywać informacje nowych artykułach oraz akcjach edukacyjnych. Gwarantuję 100% satysfakcji i żadnego spamowania!

, , , , , , ,

Dodaj komentarz

Komentarze (7)

Odpowiedz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Pin It on Pinterest