strncpy
là bao giờ câu trả lời đúng khi chuỗi điểm đến của bạn là zero-chấm dứt. strncpy
là chức năng được sử dụng với các chuỗi không cố định có chiều rộng cố định. Chính xác hơn, mục đích của nó là để chuyển đổi một chuỗi không chấm dứt thành một chuỗi có độ rộng cố định không bị chấm dứt (bằng cách sao chép). Nói cách khác, strncpy
không được áp dụng có ý nghĩa ở đây.
Lựa chọn thực sự bạn có ở đây là giữa strlcpy
và đồng bằng strcpy
.
Khi bạn muốn thực hiện sao chép "an toàn" (tức là cắt ngắn có khả năng) thành dst_arr
, chức năng thích hợp để sử dụng là strlcpy
.
Đối với dst_ptr
... Không có nội dung nào như "sao chép vào dst_ptr
". Bạn có thể sao chép vào bộ nhớ chỉ bằng dst_ptr
, nhưng trước tiên bạn phải đảm bảo rằng nó trỏ đến đâu đó và phân bổ bộ nhớ đó. Có rất nhiều cách khác nhau để làm điều đó.
Ví dụ: bạn chỉ có thể thực hiện dst_ptr
để trỏ đến dst_arr
, trong trường hợp này, câu trả lời giống như trong trường hợp trước - strlcpy
.
Hoặc bạn có thể cấp phát bộ nhớ bằng cách sử dụng malloc
. Nếu lượng bộ nhớ bạn phân bổ được đảm bảo đủ cho chuỗi (tức là ít nhất strlen(src_str) + 1
byte được phân bổ), thì bạn có thể sử dụng số strcpy
hoặc thậm chí memcpy
để sao chép chuỗi. Không có nhu cầu và không có lý do để sử dụng strlcpy
trong trường hợp này, mặc dù một số người có thể thích sử dụng nó, vì nó bằng cách nào đó mang lại cho họ cảm giác an toàn hơn.
Nếu bạn cố ý phân bổ ít bộ nhớ hơn (nghĩa là bạn muốn chuỗi của mình bị cắt bớt), thì strlcpy
sẽ trở thành chức năng phù hợp để sử dụng.
Cảm ơn. Khi bạn nói "strncpy không bao giờ là câu trả lời đúng khi bạn đang làm việc với các chuỗi zero-terminated", bạn có nghĩa là chuỗi nguồn hoặc dest? – hari
@hari: Chuỗi đích. 'strncpy' là một hàm * conversion *, chuyển đổi chuỗi nguồn không bị chấm dứt thành một chuỗi đích cố định chiều rộng cố định. – AnT
Vì vậy, nếu chuỗi đích của tôi là 'char dst_arr [10];' mà không phải là null-chấm dứt. Sau đó, tôi nên sử dụng 'strlcpy' đúng? – hari