2013-10-03 10 views
5

Wiem, że powszechnie przyjmuje się, że używanie strcmp jest właściwym sposobem porównywania łańcuchów, ale moje pytanie brzmi: dlaczego? Według pomocy:Dlaczego nie używamy == do porównywania ciągów znaków w Matlab

a == B jest elementem poprzez porównanie elementów A i B i powraca do matrycy o tej samej wielkości i elementy ustawione na logiczną 1 gdzie związek jest prawdziwa i elementy ustawione na logiczne 0 gdzie jest nie.

Wygląda na to, że wszystkie przykłady zabawek, które wymyślę.

Odpowiedz

5

strcmp sprawdza również, czy wejścia są klasy char, np. strcmp('a',double('a')) zwraca wartość false, ale 'a' == double('a') zwraca wartość true. strcmp czysto obsługuje puste dane wejściowe i nie musisz się martwić, że oba łańcuchy mają tę samą długość. Możesz także użyć danych wejściowych do komórek, aby łatwo porównać wiele ciągów, co jest przydatne.

Porównanie łańcuchów może być znacznie wolniejsze - przynajmniej w obecnym Matlabie. Ale nie przedwcześnie optymalizuj swój kod kosztem czytelności i łatwości konserwacji. Używaj tylko == (lub może isequal) w rzadkich przypadkach, kiedy naprawdę potrzebujesz wydajności i jesteś bardzo pewien, co porównujesz (na przykład najpierw użyj ischar i isempty).

+3

Główna różnica, jak wskazuje @Coconut Jones, polega na tym, że '==' jest porównywaniem elementarnym, a więc błędami, jeśli łańcuchy mają różne długości, w przeciwnym razie zwraca tablicę logiczną, którą musisz zmniejszyć za pomocą 'all'. 'isequal' z drugiej strony jest prawie taki sam jak' strcmp' dla napisów. – Edric

5

wykorzystuje porównywanie znaków po znaku, więc próba sprawdzenia pod kątem równości z == za pomocą dwóch łańcuchów o różnych długościach powinna dać błąd.

+0

To uczciwa kwestia, ale czy to jedyny powód? – maxywb

+1

Błąd jest całkiem niezłym powodem. Chcesz, aby wypowiadał "fałsz", jeśli są różne, a nie błąd. – chappjc

+1

Innym (choć niewielkim) problemem z wydajnością jest to, że '==' zawsze porównuje wszystkie znaki - podczas gdy 'strcmp' powinien (miejmy nadzieję) zwrócić false przy pierwszym znalezionym nie-równym znaku. – sebastian

4

Kolejny mały wyjątek dotyczy pustych ciągów.

Stosowanie '' == '' w instrukcji if jest wartością false.

strcmp('','') jest prawdziwy.

Powiązane problemy