Porovnávání řetezců v jazyku C
January 4, 2007 on 5:34 pm | In Programing |Tohle je určitě další zápisek, za který mě bude opět mnoho lidí zatracovat. Ano píšu o něčem co je už tisíckrát opakované a co už všichni dávno vědí. Jenže problém je, že nevědí. Sem tam se někdo ozve z mých kamaradů a zeptá se pročpak jim nefunguje porovnávání řetězců. Nikdy se mi nechce na webu hledat vysvětlení, takže to každému vysvětluji zvlášť. A takříkajíc už mě to nebaví, tak si napíši vysvětlení tady a další lidi s tímto problémem pošlu sem. No není to nádhera?
V pascalu myslím stačí na porovnání řetězců pouhé rovnítko, stejně tak v PHP obyčejný operátor porovnání (zde tedy už dvě rovnítka za sebou). Jenže prosté porovnání nebude v C fungovat tak jak by jste chtěli.
char ret1[] = "Maminka";
char ret2[] = "Maminka";
if(ret1 == ret2)
{
printf("Retezce jsou shodne");
}
Překladač zde nezahlásí žádnou chybu a naoko tedy vypadá vše O.K. Tedy až na fakt, že řetezec “Retezce jsou shodne” se nikdy nevytiskne. Proč? C nemá žádný datový typ pro řetězce. Ty jsou totiž reprezentovány jako pole znaků (char *ret1 = “Maminka”; je ekvivalentem k zapisu uvedeném výše) ukončené nulovým bytem (známá escape sekvence ‘\0′). Co tedy je uloženo v proměné ret1 a ret2? Jsou to pole a název proměné se chová jako ukazatel na první prvek, takže obsahují pamětové adresy. Jinými slovy, zde se neporovnává obsah paměti na kterou ukazuje, ale kde jsou tyto řetězce v paměti uloženy. ret1 ‘obsahuje’ třeba adresu ABC987 a ret2 adresu FED987, které shodné nejsou a tak porovnaní vrátí false.
Co tedy?
Na nápravu se příliš nehodi dereference ukazatele - ta porovná pouze první znak a my potřebujeme skontrolovat celé pole. Jedním z možností je napsat si fci, která prvek po prvku skontroluje zda-li jsou znaky stejné, nebo můžeme použít již fci, kterou udělali za nás - strcmp().
No Comments yet »
RSS feed for comments on this post. TrackBack URI
Leave a comment
Powered by WordPress with Pool theme design by Borja Fernandez.
Entries and comments feeds.
Valid XHTML and CSS. ^Top^