2012-02-03 38 views
5

Więc mam dylemat. I trzeba porównać dwa ciągi C stylu i szukałem dla funkcji, które byłyby najbardziej jest właściwa:Jaka jest właściwa funkcja porównywania dwóch łańcuchów w stylu C?

memcmp //Compare two blocks of memory (function) 
strcmp //Compare two strings (function) 
strcoll //Compare two strings using locale (function) 
strncmp //Compare characters of two strings (function) 
strxfrm //Transform string using locale (function) 

Pierwszym moim zdaniem jest dla adresów, więc pomysł jest na zewnątrz. Drugi brzmi jak najlepszy wybór dla mnie, ale mimo to chcę usłyszeć informację zwrotną. Pozostałe trzy pozostawiają mnie bez pojęcia.

+0

* "Pierwszy, który moim zdaniem jest adresowany" * - Nie, dotyczy to dowolnych bloków pamięci. Na końcu wszystkie te funkcje pobierają adresy wskazujące bloki pamięci do porównania. Ale żaden nie porównuje adresów. Ale z twoich komentarzy w kodzie, zdaję sobie sprawę, że jesteś tego świadomy i po prostu wyraziłeś się trochę niedokładnie. –

Odpowiedz

19

Do ogólnych porównań łańcuchów odpowiednia jest funkcja strcmp. Należy użyć strncmp, aby porównać tylko kilka znaków z ciągu (na przykład przedrostek) i memcmp, aby porównać bloki pamięci.

To powiedziawszy, ponieważ używasz C++, powinieneś całkowicie tego unikać i używać klasy std::string, która jest znacznie łatwiejsza w użyciu i generalnie bezpieczniejsza niż ciągi w stylu C. Możesz łatwo porównać dwie wartości: std::string s, używając tylko operatora ==.

Mam nadzieję, że to pomoże!

+0

Dziękuję, chciałbym, ale na razie nasz profesor ogranicza nas do korzystania tylko z C Strings. – Yokhen

+0

Sprawdź kod funkcji C plus i przeczytaj ... może znajdziesz niespodziankę. @templatetypedef Myślę, że == nie jest operatorem rytmu w tym przypadku imho. – crsuarezf

+0

@ ingcarlos- Masz rację, że nie powinieneś używać tutaj ==. Moją sugestią jest przejście na std :: string C++, w którym to przypadku operator == jest do zrobienia. – templatetypedef

3

Zarówno memcmp i strcmp będzie działać dobrze. Aby użyć tego pierwszego, musisz wcześniej znać długość krótszego łańcucha.

+2

Jeśli nazwiesz 'memcmp' z długością poprzedniego łańcucha, to powie ci, że' "abc" 'i' "abcdef" 'są równe. Możesz przekazać mu długość krótszego łańcucha plus jeden (i zobaczy i porówna terminator '' \ 0 '') - ale ponieważ 'strcmp' jest specjalnie zaprojektowany do porównywania łańcuchów, to właśnie powinieneś użyć. –

+0

Zgodziłbym się z tym wszystkim, tak. –

+0

Ktoś wie, czy 'memcmp' może być szybszy, powiedzmy, ze względu na znajomość długości z góry i tym samym pozwalając na pewną optymalizację, patrząc na fragmenty długości słowa w pierwszej kolejności? – Keith

Powiązane problemy