2009-03-10 27 views
22

strlen(const char *s) được xác định khi s không bị hủy bỏ và nếu có, nó sẽ trở lại như thế nào?strlen() trên chuỗi char không null kết thúc?

+8

Hãy tự hỏi mình: Làm thế nào nên strlen() biết nơi chuỗi của bạn kết thúc, nếu nó không null chấm dứt? – DevSolar

+1

Về mặt kỹ thuật, không có thứ gì như một chuỗi C không phải là NUL, bởi vì NUL-Terminator được định nghĩa là một phần của chuỗi C :) – fredoverflow

Trả lời

30

Không, nó không được xác định. Nó có thể dẫn đến vi phạm truy cập bộ nhớ, vì nó sẽ tiếp tục đếm cho đến khi nó đạt đến byte bộ nhớ đầu tiên có giá trị là 0.

+13

Nó cũng có thể làm cho ma quỷ bay ra khỏi mũi của bạn. http://catb.org/jargon/html/N/nasal-demons.html –

+2

Điều đó giải thích lỗ mũi đau nhức của tôi. –

1

Nó sẽ trả về số ký tự gặp phải trước khi '\ 0' được tìm thấy.

+0

....... hay không. – alk

1

Nó không được xác định. Nó gây ra hành vi không xác định có nghĩa là bất cứ điều gì có thể xảy ra, rất có thể chương trình của bạn sẽ sụp đổ.

-2

Nó luôn được xác định.

Nó sẽ trả về độ dài của "chuỗi" cho đến khi nó đạt đến một byte có null trong đó. Ý tưởng tồi vì điều này có thể gây tràn bộ đệm.

+2

Không, nó không được xác định. Một khi bạn bắt đầu đi ngang qua không gian đã được phân bổ cho chuỗi, hoặc thông qua malloc hoặc trên stack/heap, kết quả là hoàn toàn không xác định. –

9

Từ tiêu chuẩn C99:

Chức năng strlen trả về số các ký tự mà đứng trước chấm dứt ký tự null.

Nếu không có ký tự rỗng có nghĩa là kết quả không xác định.

0

strlen() chỉ hoạt động (thực hiện điều gì đó hữu ích) đối với các chuỗi bị vô hiệu hóa; bạn sẽ nhận được một kết quả hoàn toàn không xác định nếu bạn vượt qua bất cứ điều gì khác hơn thế. Nếu bạn may mắn, nó sẽ không gây ra sự cố :)

+2

chỉnh sửa, nếu anh ta may mắn, nó sẽ sụp đổ. Bạn sẽ không muốn loại lỗi này không được chú ý :-P. –

2

Nếu chuỗi của bạn không bị NUL chấm dứt, chức năng sẽ tiếp tục tìm kiếm cho đến khi tìm thấy nó.

Nếu bạn may mắn, điều này sẽ khiến chương trình của bạn bị lỗi.

Nếu bạn không may mắn, bạn sẽ nhận được một chiều dài lớn hơn dự kiến ​​trở lại, với nhiều giá trị 'không mong muốn' trong đó.

5

Có thể bạn cần strnlen?

+5

Thật không may, đây không phải là một phần của tiêu chuẩn C. – joveha

0

man 3 strcspn

size_t strcspn (const char * s, const char * từ chối);

Một chiều dài của dây ruột phân:

size_t len = strcspn(str, ":"); 

Một chiều dài của dấu phẩy phân cách chuỗi:

size_t len = strcspn(str, ","); 

Một chiều dài của phân định tab chuỗi:

size_t len = strcspn(str, "\t"); 
Các vấn đề liên quan