Tôi hiện đang làm việc trên một thư viện được viết bằng C. Nhiều chức năng của thư viện này mong đợi một chuỗi như char*
hoặc const char*
trong các đối số của chúng. Tôi đã bắt đầu với các hàm đó luôn mong đợi độ dài của chuỗi size_t
vì không yêu cầu chấm dứt null. Tuy nhiên, khi viết bài kiểm tra, điều này dẫn đến việc sử dụng thường xuyên strlen()
, như vậy:
const char* string = "Ugh, strlen is tedious";
libFunction(string, strlen(string));
Việc tin tưởng người dùng vượt qua các chuỗi kết thúc đúng sẽ dẫn đến mã kém an toàn hơn, nhưng ngắn gọn hơn và (theo ý kiến của tôi):
libFunction("I hope there's a null-terminator there!");
Vì vậy, những gì thực hành hợp lý ở đây? Làm cho API phức tạp hơn để sử dụng, nhưng buộc người dùng phải nghĩ đến đầu vào của họ hoặc ghi lại yêu cầu cho chuỗi kết thúc null và tin tưởng người gọi?
CreateFile
lấyLPTCSTR lpFileName
tham số làm đầu vào. Không có độ dài của chuỗi được mong đợi từ người gọi. Trong thực tế, việc sử dụng các chuỗi kết thúc NUL đã ăn sâu đến mức tài liệu thậm chí không đề cập đến việc tên tệp phải bị chấm dứt NUL (nhưng tất nhiên phải như vậy).