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řenV 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 povolenPozor, 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řívstrcmp 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“.
Jak psát:
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
7/10