2010-11-09 44 views

Trả lời

48

strlen thường hoạt động bằng cách đếm các ký tự trong chuỗi cho đến khi tìm thấy ký tự \0. Triển khai chính tắc sẽ là:

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

Không có lỗi cố hữu trong hàm, nó hoạt động chính xác như được ghi chép.

Đó không phải là để nói rằng nó không có vấn đề, để wit:

  • nếu bạn vượt qua nó một "chuỗi" mà không có một \0 lúc kết thúc, bạn có thể gặp vấn đề về mặt kỹ thuật nhưng , đó không phải là chuỗi C (a) và đó là lỗi của riêng bạn.
  • bạn không thể đặt \0 ký tự trong chuỗi của mình nhưng, một lần nữa, nó sẽ không phải là chuỗi C trong trường hợp đó.
  • nó không phải là cách hiệu quả nhất - bạn có thể lưu trữ một chiều dài lên phía trước để bạn có thể có được chiều dài nhanh hơn nhiều.

Nhưng không có lỗi nào trong số đó là lỗi, chúng chỉ là hậu quả của quyết định thiết kế.

Xem thêm this excellent article bởi Joel Spolsky nơi ông thảo luận về các định dạng chuỗi khác nhau và đặc điểm của họ, bao gồm chuỗi C bình thường, chuỗi Pascal và sự kết hợp của hai, null chấm dứt chuỗi Pascal, mặc dù ông có nhiều hơn, chúng ta sẽ nói, " đầy màu sắc hạn" cho họ :-)


(a) AC chuỗi được định nghĩa là một loạt các ký tự không terminator (ví dụ, bất kỳ khác hơn \0) tiếp theo là terminator đó. Do đó định nghĩa này không cho phép cả hai terminator nhúng trong chuỗi và chuỗi không có một terminator như vậy.

Hoặc, đặt nó một cách ngắn gọn hơn (theo tiêu chuẩn ISO):

Một chuỗi là một chuỗi liền kề của các nhân vật kết thúc bằng và bao gồm các ký tự null đầu tiên.

Các vấn đề liên quan