Là 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?
Trả lời
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.
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 –
Điều đó giải thích lỗ mũi đau nhức của tôi. –
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 đổ.
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.
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. –
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.
Không thực sự và sẽ gây ra bad things.
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ố :)
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. –
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 đó.
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");
- 1. Lấy chuỗi kết thúc null từ System.Text.Encoding.Unicode.GetString
- 2. strlen() trả về số chuỗi với null terminator
- 3. C++ char mảng null terminator location
- 4. Làm các chuỗi ký tự kết thúc bằng một terminator null có chứa một null-terminator không?
- 5. null chấm dứt chuỗi
- 6. libunistring u8_strlen() bằng strlen()?
- 7. PHP - tại sao không đếm() làm việc như strlen() trên một chuỗi?
- 8. nohup trên windows, exec mà không cần đợi kết thúc
- 9. Gọi phương thức khi chuỗi kết thúc
- 10. Biên dịch "strlen()" có hiệu quả không?
- 11. String.Replace (char, char) hoặc Replace (chuỗi, chuỗi)?
- 12. fgets tự nhiên đặt một số không kết thúc trong C?
- 13. hiểu hàm strlen trong C
- 14. Ngắt chuỗi không kết thúc cuộc gọi chặn trên luồng đầu vào đọc
- 15. Kết hợp Regex bắt đầu và kết thúc chuỗi
- 16. sizeof for a null terminated const char *
- 17. Làm các chuỗi C# kết thúc bằng chuỗi rỗng?
- 18. Có sử dụng strlen() trong điều kiện vòng lặp chậm hơn là chỉ kiểm tra ký tự null không?
- 19. sizeof vs strlen
- 20. Kết thúc không mong đợi của luồng đầu vào ZLIB
- 21. Tạo chuỗi không an toàn từ char []
- 22. ifstream.eof() - kết thúc tệp được truy cập trước khi kết thúc thực sự
- 23. Phân loại MySQL: NULL đến chỉ mục kết thúc & sử dụng? Không thể?
- 24. C# gán char và mảng char cho chuỗi?
- 25. Làm cách nào để chuyển đổi một mảng byte có ký tự kết thúc null thành một chuỗi trong Java?
- 26. cắt ngắn chuỗi, nhưng loại bỏ giữa chuỗi thay vì kết thúc
- 27. Tại sao kết quả của unsigned char << unsigned char không phải là unsigned char
- 28. Tạo và kết thúc chuỗi trong Windows bao lâu?
- 29. Lặp lại qua chuỗi char bằng char
- 30. Chấm dứt chuỗi - char c = 0 vs char c = '\ 0'
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
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