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
- 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()
. - 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. - 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. - 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. - 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. - 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ệ. 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ớic_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ề constcharT*
và đảm bảo kết thúc bằng null.data()
trả về constcharT*
nhưng không đảm bảo kết thúc bằng null.
- Từ C++11:
c_str()
trả về constcharT*
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ớic_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_str | Trả 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 |
copy | Sao 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 |
front | Trả về tham chiếu đến ký tự đầu tiên của chuỗi |