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

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Powered by WordPress with Pool theme design by Borja Fernandez.
Entries and comments feeds. Valid XHTML and CSS. ^Top^