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? – nieważ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. tablica char (dla std::string należy przekazać c_str())
%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[6];
    
    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.

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)

  • Milosz pisze:

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

  • Piotr Wiktor Turowski pisze:

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

    • lukas124 pisze:

      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 pisze:

        #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 pisze:

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

      • lukas124 pisze:

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

Odpowiedz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Pin It on Pinterest