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

std::string::data

#include <string>

// Phiên bản const (có trước C++11 và vẫn còn từ C++11)
const charT* data() const noexcept;

// Phiên bản non-const (từ C++11)
charT* data() noexcept;

Trả về một con trỏ đến mảng ký tự bên trong mà std::string sử dụng để lưu trữ nội dung của chuỗi.

Tham số

Không có tham số

Giá trị trả về

charT*

  • Một con trỏ hằng trỏ đến mảng ký tự bên trong của chuỗi. (Phiên bản const)
  • Một con trỏ trỏ đến mảng ký tự bên trong của chuỗi. (Phiên bản non-const (từ C++11))

Đặc điểm

  1. Từ C++11, data() đảm bảo rằng mảng ký tự mà nó trả về sẽ luôn được kết thúc bằng ký tự null (\0), giống như c_str().
  2. Con trỏ trả về bởi data() không được sở hữu bởi người gọi. Bạn không cần (và không được phép) giải phóng bộ nhớ cho con trỏ này.
  3. Con trỏ trả về bởi data() có thể bị vô hiệu hóa nếu đối tượng std::string bị thay đổi hoặc bị hủy.
  4. Nếu bạn chỉ cần lấy chuỗi ký tự C-style (const) và đảm bảo kết thúc bằng null, c_str() thường được ưu tiên hơn vì nó thể hiện rõ ràng mục đích.
  5. Trước C++11, data() không đảm bảo kết thúc bằng null, vì vậy bạn phải cẩn thận khi sử dụng nó với các hàm yêu cầu chuỗi C-style.
  6. Con trỏ trả về bởi data() có hiệu lực cho đến khi đối tượng std::string bị thay đổi (ví dụ: gọi các phương thức non-const, clear(), insert(), append(), ...) hoặc bị hủy. Sau đó, con trỏ này trở nên không hợp lệ.
  7. data() thường được sử dụng khi:
    • Bạn cần truy cập trực tiếp vào mảng ký tự của chuỗi để thực hiện các thao tác ở mức thấp (ví dụ: tối ưu hóa hiệu năng, thao tác bit, ...).
    • Bạn cần truyền chuỗi std::string đến các hàm chấp nhận con trỏ đến mảng ký tự (từ C++11, data() tương đương với c_str() về mặt này).
    • Cần sử dụng với các thư viện chỉ hỗ trợ làm việc trực tiếp với mảng ký tự.
Phân biệt với c_str()
  • Trước C++11:
    • c_str() trả về const charT* và đảm bảo kết thúc bằng null.
    • data() trả về const charT* nhưng không đảm bảo kết thúc bằng null.
  • Từ C++11:
    • c_str() trả về const charT* và đảm bảo kết thúc bằng null.
    • data() có hai phiên bản:
      • const charT* data() const noexcept; (tương đương với c_str())
      • charT* data() noexcept; (cho phép thay đổi nội dung và đảm bảo kết thúc bằng null)

Ví dụ

#include <iostream>
#include <string>
#include <cstring> // Cho strlen()

int main() {
std::string str = "Hello, world!";

// Lấy con trỏ đến mảng ký tự (phiên bản const)
const char* cstr = str.data();
std::cout << "C-string (using data()): " << cstr << std::endl;
std::cout << "Length (using strlen): " << std::strlen(cstr) << std::endl;

// Thay đổi nội dung chuỗi thông qua con trỏ (phiên bản non-const, từ C++11)
std::string str2 = "modify me";
char* ptr = str2.data();
ptr[0] = 'M';
ptr[7] = 'Y';
std::cout << "Modified string (using data()): " << str2 << std::endl;

return 0;
}

Các hàm liên quan

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
copySao chép một chuỗi con của chuỗi hiện tại vào một mảng ký tự do người dùng cung cấp
[]Truy cập đến ký tự tại một vị trí cụ thể trong chuỗi
frontTrả về tham chiếu đến ký tự đầu tiên của chuỗi