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++
Trả lời
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.
Ngoài ra, strcpy cũng hợp pháp và nguy hiểm trong C++ vì nó ở trong C. –
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
'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. –
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.
Aah thay thế tốt đẹp, đã không nghĩ về điều đó :) – Aerus
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);
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:
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. –
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à. –
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. –
- 1. C: Tại sao strcpy trả về đối số của nó?
- 2. Strcpy trong Java là gì?
- 3. strcpy ... muốn thay thế bằng strcpy_mine mà sẽ strncpy và null chấm dứt
- 4. lỗi phân đoạn với strcpy
- 5. strcpy-sse2-unaligned.S không tìm thấy
- 6. Thay thế 'bằng \' trong C#
- 7. Làm thế nào để thay thế hàm thư viện chuẩn C?
- 8. Chuỗi C# Thay thế
- 9. Thay thế cho #import trong Visual C++
- 10. Regular Expression thay thế hoa trong C#
- 11. Thay thế cho __uuidof trong C
- 12. Thay thế chuỗi trong Objective-C
- 13. Thay thế cho khóa C trong Emacs?
- 14. Địa chỉOf thay thế trong C#
- 15. Thay thế ký tự "trong C#
- 16. đúp chuỗi quote thay thế trong C#
- 17. sự khác biệt giữa char * và char [] với strcpy()
- 18. C++ thay thế cho perror()
- 19. Chuỗi Thay thế bằng C++
- 20. C++ 11 thay thế pthread_cond_timedwait
- 21. Thay thế dòng mới C#?
- 22. Làm thế nào để thay đổi định dạng của một cột của bảng excel trong C#?
- 23. Ký tự C++ thay thế
- 24. C# thay thế \" nhân vật
- 25. thay thế màu sắc trong một hình ảnh trong C#
- 26. Thay thế của Html.Raw trong ASP.NET WebForms
- 27. thay thế của @formula trong jpa
- 28. Thay đổi màu nền của nhãn trong C#
- 29. SQLite - thay thế một phần của chuỗi
- 30. Thay thế thích hợp cho thiếu 'cuối cùng' trong C++
Chuỗi của bạn có bị chấm dứt hay không? http://stackoverflow.com/q/4691608/176769 – karlphillip