Porovnávání řetězců

Zadal uživatel správné heslo? (Ve skutečném programu by heslo psal uživatel. Programy na tomto webu ale dostávají data z proměnných.) První nápad je porovnat řetězce pomocí ==. Program se tady přeloží, ale nedělá, co byste čekali:

char heslo[] = "sezam";
char pokus[] = "sezam";
if (pokus == heslo) {
    printf("Přístup povolen\n");
} else {
    printf("Přístup odepřen\n");
}

Program vypíše:

Přístup odepřen

V obou polích je stejný text, a program přesto tvrdí, že se liší. Operátor == totiž u dvou polí neporovnává jejich znaky. Zjišťuje jen, jestli jsou obě strany totéž pole, tedy totéž místo v paměti počítače. Každé pole má v paměti své vlastní místo, takže u dvou různých polí je odpověď vždy „ne“. (Clang na to upozorní varováním, ale varování se na tomto webu nezobrazují.)

Texty porovnáte funkcí strcmp (compare znamená porovnat) z knihovny string.h. Ta oba řetězce prochází znak po znaku a dá celé číslo: 0, když jsou texty stejné:

char heslo[] = "sezam";
char pokus[] = "sezam";
if (strcmp(pokus, heslo) == 0) {
    printf("Přístup povolen\n");
} else {
    printf("Přístup odepřen\n");
}

Program vypíše:

Přístup povolen

Pozor, 0 tu znamená „stejné“, tedy opak toho, co byste možná čekali. V podmínce je 0 nepravda, takže if (strcmp(pokus, heslo)) by znamenalo „pokud se texty liší“. Pište proto vždy == 0, aby kód říkal přesně to, co dělá.

Když se texty liší, číslo prozradí jejich abecední pořadí. Je záporné, když je první text v abecedě dřív než druhý, a kladné, když je až za ním. Nespoléhejte na konkrétní číslo, třeba -1. Kontrolujte jen, jestli je menší, nebo větší než 0:

char prvni[] = "jahoda";
char druhe[] = "malina";
if (strcmp(prvni, druhe) < 0) {
    printf("%s je v abecedě dřív\n", prvni);
} else {
    printf("%s je v abecedě dřív\n", druhe);
}

Program vypíše:

jahoda je v abecedě dřív

strcmp porovnává znaky jako čísla: 'A' je 65, 'B' 66 a tak dále, malá písmena začínají na 'a', což je 97. Velká a malá písmena se proto liší: strcmp("Sezam", "sezam") není 0. A všechna velká písmena jsou před všemi malými, takže pro strcmp je "Zebra" dřív než "auto". O české abecedě strcmp nic neví: podle něj je "chleba" dřív než "hrad", i když v české abecedě je „ch“ až za „h“.

Pokyny

Pokus je správný, ale program vypíše Přístup odepřen. Opravte podmínku: porovnejte texty pomocí strcmp a == 0. Program pak vypíše Přístup povolen.

Pod podmínku vytvořte jména dvou hráčů, char hrac1[] = "Petra"; a char hrac2[] = "Adam";. Pomocí strcmp vypište to, které je v abecedě dřív, ve tvaru Adam je v abecedě dřív.

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

7/10