Według mojego zrozumienia, strcmp()
(bez "n"), po wyświetleniu znaku pustego w obu argumentach, natychmiast przestaje przetwarzać i zwraca wynik.
Dlatego jeśli jeden z argumentów jest znany z 100% pewnością, że jest zakończony znakiem NUL (np. Jest literałem łańcuchowym), nie ma żadnej korzyści bezpieczeństwa przy użyciu strncmp()
(z "n") z wywołaniem do strlen()
jako część trzeciego argumentu, aby ograniczyć porównanie do znanej długości ciągu, ponieważ strcmp()
nigdy nie będzie więcej znaków niż w łańcuchu kończącym znane.Czy strlen() w wyrażeniu strncmp() pokonuje cel użycia strncmp() over strcmp()?
W rzeczywistości wydaje mi się, że wezwanie do strncmp()
którego długość argument jest strlen()
na jednym z dwóch pierwszych argumentów różni się tylko od przypadku strcmp()
tym, że marnuje czas liniowy w rozmiarze znanym-kończącym ciąg znaków przez oszacowanie wyrażenia strlen()
.
Rozważmy: Kod
Próbka A: kod
if (strcmp(user_input, "status") == 0)
reply_with_status();
Próbka B:
if (strncmp(user_input, "status", strlen("status")+1) == 0)
reply_with_status();
Czy jest jakaś korzyść tych pierwszych na drugi? Ponieważ widzę to w kodach innych osób: lot.
Czy mam błędne zrozumienie działania tych funkcji?
Oddałbym ci głos, ale nie mam wystarczającej reputacji. : p Dziękuję za szczegółową odpowiedź! – cvp
Niektóre/większość kompilatorów może obliczyć 'strlen (" status ")' jako stałą wartość. W przeciwnym razie, zgadzam się. –