2010-09-20 32 views
5

Tôi đang học C. Và, tôi thấy hàm này tìm chiều dài của một chuỗi.hiểu hàm strlen trong C

size_t strlen(const char *str) 
{ 
size_t len = 0U; 
while(*(str++)) ++len; return len; 
} 

Bây giờ, khi nào thoát vòng lặp? Tôi bối rối, vì str ++, luôn làm tăng con trỏ.

+0

FYI: Đọc Kerningham và Richie. Họ đã giới thiệu kiểu lập trình này. Một lời đề phòng mặc dù không bao giờ sử dụng phong cách này trong các ứng dụng thương mại. –

+0

Tôi có cuốn sách đó, nhưng trước tiên sử dụng các tài nguyên khác để có được sự thoải mái với C :) – jess

+0

@ user439578: Phong cách (bất kỳ kiểu nào) phải làm với loại ứng dụng? Chỉ cần sử dụng phong cách bạn thích tốt hơn và 'indent' (với kiểu nhà) trước khi gửi mã. – pmg

Trả lời

10
  1. C chuỗi được chấm dứt bởi nhân vật NUL trong đó có giá trị của 0
  2. 0 là false trong C và bất cứ điều gì khác là true.

Vì vậy, chúng tôi tiếp tục tăng con trỏ vào chuỗi và độ dài cho đến khi chúng tôi tìm thấy NUL và sau đó quay lại.

+0

Tôi biết điểm đầu tiên. Thứ hai làm cho nó rõ ràng !! Cảm ơn – jess

+1

Tôi đồng ý với câu trả lời của bạn, nhưng để đề cập đến ASCII. Sẽ tốt hơn nếu bỏ điều đó ra.'nul' được đảm bảo là' 0' với bất kỳ mã hóa nào. –

+0

@Jens được sửa đổi theo đề xuất của bạn. – doron

11
while(*(str++)) ++len; 

là giống như:

while(*str) { 
++len; 
++str; 
} 

là giống như:

while(*str != '\0') { 
++len; 
++str; 
} 

Vì vậy, bây giờ bạn nhìn thấy khi str điểm đến null char ở phần cuối của chuỗi, các điều kiện kiểm tra thất bại và bạn dừng vòng lặp.

+1

"giống như:" ngoại trừ giá trị cuối cùng của 'str', nhưng điều đó không được sử dụng trong trường hợp này. –

0

Khi *(str++) trả về 0, vòng lặp thoát. Điều này sẽ xảy ra khi str trỏ đến ký tự cuối cùng của chuỗi (vì các chuỗi trong C bị ngắt 0).

2

Bạn cần hiểu hai khái niệm để lấy ý tưởng về hàm:

1 °) Chuỗi C là một mảng ký tự.

2 °) Trong C, biến mảng thực sự là con trỏ đến trường hợp đầu tiên của bảng.

Vậy strlen sẽ làm gì? Nó sử dụng con trỏ arithmetics để phân tích bảng (++ trên một con trỏ có nghĩa là: trường hợp tiếp theo), cho đến khi nó được đến tín hiệu kết thúc ("\ 0").

+0

bảng ký tự? Bạn có nghĩa là mảng ký tự? –

+1

Đúng. Tôi luôn mắc lỗi này bằng tiếng Anh (bằng tiếng Pháp, chúng tôi nói "tableau" cho "mảng", vì vậy tôi có xu hướng đi với "bảng"). – Raveline

0

Đúng, str++ tăng bộ đếm và trả về giá trị trước đó. Dấu hoa thị (*) dereferences con trỏ, nghĩa là nó cung cấp cho bạn giá trị ký tự.

Chuỗi C kết thúc bằng byte không. Các vòng lặp while thoát khi điều kiện không còn đúng, có nghĩa là khi nó bằng không.

Vì vậy, vòng lặp while chạy cho đến khi nó gặp một byte không trong chuỗi.