strncpy()
được cho là bảo vệ khỏi tràn bộ đệm. Nhưng nếu nó ngăn chặn một tràn mà không có null chấm dứt, trong tất cả các khả năng một chuỗi tiếp theo hoạt động sẽ tràn. Vì vậy, để bảo vệ chống lại điều này tôi thấy mình thực hiện:Tại sao strncpy không null chấm dứt?
strncpy(dest, src, LEN);
dest[LEN - 1] = '\0';
man strncpy
cho:
Các strncpy() chức năng tương tự, ngoại trừ việc không quá n byte src được sao chép. Do đó, nếu không có byte rỗng trong số n byte đầu tiên của src, kết quả sẽ không bị hủy.
Without null kết thúc một cái gì đó dường như vô tội như:
printf("FOO: %s\n", dest);
... có thể sụp đổ.
Có các phương án thay thế an toàn hơn, tốt hơn cho strncpy()
?
Lưu ý rằng trên MacOS X (BSD) trang người đàn ông nói (của ''extern char * strncpy (char * giới hạn s1, const char * hạn chế s2, size_t n);' '): Hàm strncpy() sao chép tại hầu hết n ký tự từ s2 vào s1.Nếu s2 dài hơn n ký tự, phần còn lại của s1 được điền bằng các ký tự '\ 0 '. Nếu không, s1 không bị chấm dứt. –
Không nên là đích [LEN-1] = '\ 0'; ? – codeObserver
Đây là cách tôi nghĩ chúng tôi sẽ tạo một bản sao của chuỗi: int LEN = src.len; str * dest = new char [LEN + 1]; strncpy (dest, src, LEN); dest [LEN] = '\ 0'; – codeObserver