2013-05-05 37 views
5

Tại sao strcpy(3) (và strncpy(3)) trả lại đối số đầu tiên của họ? Tôi không thấy cách này thêm bất kỳ giá trị nào. Thay vào đó, thường xuyên tôi muốn có số byte được sao chép trả về.C: Tại sao strcpy trả về đối số của nó?

Phụ lục: Tôi phải làm gì khi tôi cũng cần độ dài của chuỗi kết quả? Tôi có thực sự phải triển khai phiên bản của riêng mình không?

+2

Vì vậy, nó có thể được sử dụng trong chuỗi chức năng. –

+1

Sẽ hữu ích hơn nhiều nếu một biến thể của 'strcpy()' trả về một con trỏ tới byte ''\ 0'' ở cuối chuỗi. Tuy nhiên, nếu bạn kiểm tra mọi thứ trước khi thực hiện sao chép (bạn nên an toàn), bạn có thể sử dụng 'memmove()' (hoặc có thể 'memcpy()') thay vì 'strcpy()'. Đó là chỉ khi bạn không có một chiều dài có sẵn mà không thể sử dụng những người, nhưng nó được cho là không an toàn để làm việc sao chép nếu bạn không biết độ dài của chuỗi nguồn và bộ đệm mục tiêu. –

Trả lời

1

Vì vậy mà bạn có thể làm điều gì đó như

char * str = strcpy(malloc(12), "MyNewString"); 
+5

… nguy cơ sẽ không thoát khỏi bất kỳ ai đã xem phiên bản của câu trả lời này với '11' trong đó' 12' bây giờ là. –

+0

Tại sao không chỉ sử dụng strdup? Hay là nó bị mất tích vào những thời điểm đó? – sashoalm

+1

'strdup' là, tôi nghĩ, một bổ sung năm 1980, khi C đã chuyển hướng sang tiếng địa phương. Nó không có trong Unix Unix, nó vẫn không có trong ISO C, mặc dù POSIX luôn có nó. –

2

Vì lý do lịch sử. strcpy và bạn bè hẹn hò trở lại những năm bảy mươi sớm, và tôi đoán trường hợp mục đích sử dụng cho các giá trị trả về sẽ là một loại chaining:

// copy src into buf1 and buf2 in a single expression 
strcpy(buf1, strcpy(buf2, src)); 

Hoặc

char *temp = xmalloc(strlen(const_str) + 1); 
function_that_takes_mutable_str(strcpy(temp, const_str)); 
+0

Không phải họ có biểu thức dấu phẩy vào thời điểm đó? 'function1 ((strcpy (buf1, const_str), buf1))'. –

+1

@ JoSo: Tôi không chắc chắn khi các biểu thức dấu phẩy được giới thiệu, nhưng tôi đã đọc khá nhiều mã C cũ và tôi không nghĩ rằng mình từng thấy nó đang được sử dụng. Cá nhân tôi cũng không bao giờ sử dụng nó ngoại trừ trong các macro. –

0

Hầu hết các chức năng chuỗi trong Thư viện C được thiết kế bởi những người nghiệp dư. Ví dụ, trong 25 năm của sự nghiệp của tôi, tôi không bao giờ sử dụng hàm strcat(), nhưng tôi vẫn luôn nối các chuỗi. Ngoài ra, nếu bạn nghĩ printf(), có rất ít tài liệu nếu bạn vượt qua NULL cho một đối số% s. Điều tương tự cũng xảy ra đối với% c chuyển một '\ 0', hoặc một malloc (0).

Đáng buồn thay, strcpy hữu ích nhất() sẽ trả về một con trỏ đến cuối bộ đệm đích để sao chép chuỗi.

Các vấn đề liên quan