2011-01-20 36 views
7

Trong C i sử dụng strcpy để thực hiện một bản sao sâu của một chuỗi, nhưng nó vẫn 'tốt' sử dụng strcpy trong C++ hay có những lựa chọn thay thế tốt hơn mà tôi nên sử dụng để thay thế?thay thế của strcpy trong C++

+0

Chuỗi của bạn có bị chấm dứt hay không? http://stackoverflow.com/q/4691608/176769 – karlphillip

Trả lời

14

Trong C++ cách dễ nhất thường là sử dụng std :: string class thay vì char *.

#include <string> 
... 
    std::string a = "Hello."; 
    std::string b; 
    b = a; 

Dòng "b = a;" làm điều tương tự bạn thường làm với strcpy.

+4

Ngoài ra, strcpy cũng hợp pháp và nguy hiểm trong C++ vì nó ở trong C. –

+0

Vì vậy, về cơ bản * luôn luôn * tạo bản sao sâu khi bạn chỉ định một chuỗi một biến khác, ok cảm ơn :) – Aerus

+14

'std :: string''s' operator = 'không thực sự làm một bản sao sâu. Nó làm một tham chiếu tính sao chép (và do đó, không làm chính xác những gì 'strcpy' nào). Nếu bạn muốn tạo một bản sao sâu của 'std :: string', bạn cần gọi nó như sau:' std :: string a = "Hello."; std :: string b; b = a.c_str(); 'buộc nó thực sự tạo một bản sao thay vì chỉ sao chép các con trỏ và tăng số lượng tham chiếu. –

3

Nếu bạn đang sử dụng C++ chuỗi, chỉ cần sử dụng constructor sao chép:

std::string string_copy(original_string); 

Trong nhiệm vụ điều hành

string_copy = original_string 

Nếu bạn phải sử dụng dây c-phong cách (tức là null-chấm dứt mảng char), sau đó vâng, chỉ cần sử dụng strcpy, hoặc như là một thay thế an toàn hơn, strncpy.

+0

Aah thay thế tốt đẹp, đã không nghĩ về điều đó :) – Aerus

2

Bạn được đề xuất sử dụng strcpy_s vì ngoài các đối số đích và nguồn, nó có đối số bổ sung cho kích thước của bộ đệm đích để tránh tràn. Nhưng điều này vẫn có lẽ là cách nhanh nhất để sao chép qua một chuỗi nếu bạn đang sử dụng mảng char/con trỏ.

Ví dụ:

char *srcString = "abcd"; 
char destString[256]; 

strcpy_s(destString, 256, srcString); 
16

tôi đặt này trong các bình luận trên, nhưng chỉ để làm cho đoạn code có thể đọc được:

std::string a = "Hello."; 
std::string b; 
b = a.c_str(); // makes an actual copy of the string 
b = a;   // makes a copy of the pointer and increments the reference count 

Vì vậy, nếu bạn thực sự muốn bắt chước hành vi của strcpy, bạn' sẽ cần phải sao chép nó bằng cách sử dụng c_str();

CẬP NHẬT

Cần lưu ý rằng các tiêu chuẩn C++ 11 cấm một cách rõ ràng mô hình copy-on-write phổ biến mà được sử dụng trong việc triển khai nhiều của std::string trước đó. Do đó, chuỗi đếm tham chiếu không còn được cho phép và sau đây sẽ tạo bản sao:

+0

Tôi không nghĩ rằng bạn có thể nói "' c_str() 'làm cho một bản sao": nó chỉ trả về dữ liệu 'char *' thô. Dữ liệu này sau đó được chuyển tới std :: string constructor để thực hiện bản sao thực tế. Nếu nó không được sao chép, thì b sẽ bị vô hiệu hóa ngay sau khi phạm vi hoặc bị hủy. –

+1

Tôi không nói 'c_str()' tạo một bản sao. Tôi nói 'b = a.c_str()' tạo một bản sao của chuỗi. 'c_str()' không phải là trọng tâm của hoạt động; toán tử gán bản sao là. –

+0

Tôi đã yêu cầu chỉnh sửa để làm cho câu hỏi rõ ràng hơn. Vui lòng thực hiện khôi phục nếu có điều gì sai. –