2010-11-09 14 views

Odpowiedz

48

strlen zwykle działa poprzez zliczanie znaków w ciągu znaków aż do znalezienia znaku \0. Kanoniczne wdrożenie byłoby:

size_t strlen (char *str) { 
    size_t len = 0; 
    while (*str != '\0') { 
     str++; 
     len++; 
    } 
    return len; 
} 

Nie ma nieodłączny błąd w funkcji, działa dokładnie tak, jak udokumentowane.

To nie znaczy, że nie ma problemów, a mianowicie:

  • jeśli przejdzie to „ciąg”, który nie posiada \0 na końcu, może napotkasz problemy, ale technicznie to nie jest ciąg znaków C (a) i to twoja wina.
  • Nie można wstawiać znaków \0 w łańcuchu, ale znowu nie byłby to ciąg znaków C w tym przypadku.
  • to nie jest najskuteczniejszy sposób - można przechowywać długość z góry, dzięki czemu można uzyskać o wiele szybciej.

Ale żadna z nich nie jest błędem, to tylko konsekwencja decyzji projektowej.

Zobacz również this excellent article przez Joel Spolsky gdzie omawia różne formaty ciągów i ich właściwości, w tym zwykłych ciągów C, ciągi Pascal i kombinacji dwóch, null zakończone ciągi Pascal, choć ma więcej, powiedzmy, " kolorowy”termin dla nich :-)


(a) AC ciąg jest zdefiniowany jako ciąg znaków spoza terminator (czyli każdy inny niż \0), a następnie przez tego terminatora. Stąd ta definicja uniemożliwia umieszczanie terminatorów w sekwencjach i sekwencjach bez takiego terminatora.

Lub oddanie go bardziej zwięźle (zgodnie z normą ISO):

ciąg jest ciągła sekwencja znaków zakończone i tym pierwszy zerowy charakter.