Předchozí [Smyčky a podmínky]

Dnešní povídání bude pouze krátké pojednání o funkci scanf, která slouží k načítání textu. Pomocí této funkce budeme tedy schopni načíst například vstup od uživatele (text, který vyťuká na klávesnici na konzoli).

Podobně jako funkce printf (pro zopakování mrkněte sem), i scanf je polymorfní funkce, jejímž prvním parametrem je tzv. format string nebo format specifier, následovaný libovolným počtem proměnných, do kterých je následně vstup uložen.

Nejjednodušší bude si scanf ukázat přímo na příkladu. Pro podrobný popis mrkněte do man pages.

#include <stdio.h>

int main(void)
{
    unsigned int pin = 987654321;
    unsigned int user_input = 0;

    printf("Zadejte Vas PIN prosim: ");
    scanf("%u", &user_input);

    if (user_input == pin) 
    {
        printf("Welcome!\n");
    } else 
    {
        printf("Nespravny PIN.\n");
    }

    return 0;
} 

(Odkaz na GitHub)

Příklad výše ilustruje možné využití funkce scanf. Prvním atributem je “%u”, specifier, který funkci říká, že může očekávat celé číslo bez znaménka, tedy nezáporné. Druhý atribut, &user_input, udává, kam se má dodané číslo uložit (proč je na začátku proměnné navíc & si povíme někdy příště). Funkce po provedení načte text, vstup od uživatele až do potvrzení klávesou Enter.

Pozor na oblíbenou chybu: Text s výzvou musí být na extra řádku dán funkcí printf, nic, co nechceme mít v proměnné ve funkci scanf této funkci nepředáváme. Následující kód sice kompiluje, ale nedělá úplně to, co by se na první pohled očekávalo:

#include <stdio.h>

int main(void)
{
    unsigned int pin = 987654321;
    unsigned int user_input = 0;

    printf("Zadejte Vas PIN prosim: ");
    scanf("PIN: %u", &user_input);

    if (user_input == pin) 
    {
        printf("Welcome!\n");
    } else 
    {
        printf("Nespravny PIN.\n");
    }

    return 0;
} 

(Odkaz na GitHub)

Zkusili jste si zadat PIN 987654321? Byl nesprávný? Schválně si zkuste pomocí printf vydat na konzoli obsah proměnné “user_input”. Compiler vám tu sice nehodil žádnou chybu, ale ani nezaplnil proměnnou podle očekávání. To, co se vám vytisklo na konzoli, patří mezi tzv. undefined behavior - nikdy nemůžete s jistotou vědět, co bude obsahem. Je to proto, že jsme řekli, že dodáme celé nezáporné číslo, avšak ve scanf jsme předali textový řetězec “PIN: %u”, kde číslo tvoří pouze jednu jeho část.

A příklad na konec. Zkuste první příklad přepsat tak, aby se trochu více podobal realitě. Výzva k zadání PINu má vybíhat tak dlouho, dokud nebude PIN zadán správně, případně přístup zablokován (třeba po 3 pokusech).

Možné řešení:
#include <stdio.h>

int main(void)
{
    unsigned int pin = 9999;
    unsigned int user_input = 0;

    int try = 0;

    do
    {
        printf("Zadejte Vas PIN prosim: ");
        scanf("%u", &user_input);

        if (user_input != pin) 
        {
            printf("Nespravny PIN.\n");
        } 
        try++;
    } while (pin != user_input && try < 3);

    if (try < 3) 
    {
        printf("Vitejte!\n");
    }
    else 
    {
        printf("Pristup zablokovan.\n");
    }
    
    return 0;
} 
(Odkaz na GitHub)


Kam dál?

Funkce v C