Chuyển tới nội dung chính

std::string::copy

#include <string>

size_type copy( charT* dest, size_type count, size_type pos = 0 ) const;

Sao chép một chuỗi con (substring) của chuỗi hiện tại vào một mảng ký tự (character array) do người dùng cung cấp.

Tham số

dest

  • Con trỏ đến mảng ký tự đích, nơi chuỗi con sẽ được sao chép đến.

count

  • Số lượng ký tự tối đa cần sao chép.

pos

  • Vị trí (index) bắt đầu trong chuỗi hiện tại để bắt đầu sao chép. Giá trị mặc định là 0 (sao chép từ đầu chuỗi).

Giá trị trả về

size_type

  • Số lượng ký tự thực sự đã được sao chép.

Đặc điểm

  1. copy() không tự động thêm ký tự null vào cuối mảng đích. Bạn phải tự thêm ký tự null nếu cần thiết.
  2. copy() không kiểm tra xem mảng đích có đủ lớn hay không. Bạn phải đảm bảo rằng mảng đích có đủ không gian để chứa số lượng ký tự cần sao chép, cộng thêm 1 cho ký tự null (nếu cần). Nếu không, bạn sẽ gặp lỗi tràn bộ đệm.
  3. Tham số pos phải nằm trong phạm vi hợp lệ của chuỗi nguồn (từ 0 đến size()). Nếu pos vượt quá size(), ngoại lệ std::out_of_range sẽ được ném ra.
  4. Tham số count xác định số lượng ký tự tối đa cần sao chép. Số lượng ký tự thực sự được sao chép có thể nhỏ hơn count nếu pos + count vượt quá kích thước của chuỗi nguồn.
  5. copy() trả về số lượng ký tự thực sự đã được sao chép.
  6. copy() thường được sử dụng khi:
    • Bạn cần chuyển đổi một phần của chuỗi std::string thành chuỗi ký tự C-style để sử dụng với các hàm hoặc thư viện chỉ chấp nhận chuỗi C-style.
    • Bạn cần sao chép một phần của chuỗi std::string vào một bộ đệm (buffer) đã có sẵn.
Phân biệt với substr() và c_str()
  • substr() trả về một đối tượng std::string mới chứa chuỗi con được trích xuất.
  • c_str() trả về một con trỏ const char* trỏ đến chuỗi ký tự C-style biểu diễn nội dung của chuỗi std::string hiện tại (đã bao gồm ký tự null).
  • copy() sao chép một phần của chuỗi std::string vào một mảng ký tự đã có sẵn (không tự động thêm ký tự null).

Ví dụ

#include <iostream>
#include <string>
#include <cstring> // Để dùng std::strlen

int main() {
std::string str = "Hello, world!";
char buffer[20]; // Đủ lớn để chứa chuỗi con và ký tự null

// Sao chép 5 ký tự đầu tiên của str vào buffer
size_t copied = str.copy(buffer, 5, 0);
buffer[copied] = '\0'; // Thêm ký tự null để tạo thành chuỗi C-style hợp lệ

std::cout << "Copied characters: " << copied << std::endl;
std::cout << "Buffer content: " << buffer << std::endl;

// Sao chép từ vị trí 7, tối đa 5 ký tự
char buffer2[10];
size_t copied2 = str.copy(buffer2, 5, 7);
buffer2[copied2] = '\0'; // Thêm ký tự null
std::cout << "Copied characters from position 7: " << copied2 << std::endl;
std::cout << "Buffer2 content: " << buffer2 << std::endl;

// Cố gắng sao chép nhiều hơn kích thước chuỗi nguồn
char buffer3[10];
size_t copied3 = str.copy(buffer3, 10, 5); //str chỉ còn 8 ký tự tính từ vị trí 5
buffer3[copied3] = '\0'; // Thêm null
std::cout << "Copied characters (more than size): " << copied3 << std::endl; // Sẽ chỉ copy 8
std::cout << "buffer3 content: " << buffer3 << std::endl;


return 0;
}

Các hàm liên quan

substrTrích xuất một chuỗi con từ một chuỗi std::string hiện có
assignGán nội dung mới cho chuỗi, thay thế nội dung hiện tại của nó
c_strTrả về một con trỏ đến một mảng ký tự chứa nội dung của chuỗi, được biểu diễn dưới dạng chuỗi ký tự kiểu C
replaceThay thế một phần của chuỗi bằng một nội dung mới
insertChèn thêm nội dung (ký tự, chuỗi, hoặc phạm vi) vào bên trong chuỗi tại một vị trí xác định
appendNối thêm nội dung vào cuối chuỗi hiện tại