Tôi cần phải sử dụng một std::string
để lưu trữ dữ liệu lấy fgets()
. Để làm điều này, tôi cần chuyển đổi char*
giá trị trả về từ fgets()
thành một std::string
để lưu trữ trong một mảng. Điều này có thể giải quyết như thế nào?
Tôi cần phải sử dụng một std::string
để lưu trữ dữ liệu lấy fgets()
. Để làm điều này, tôi cần chuyển đổi char*
giá trị trả về từ fgets()
thành một std::string
để lưu trữ trong một mảng. Điều này có thể giải quyết như thế nào?
Câu trả lời:
std::string
có một hàm tạo cho cái này:
const char *s = "Hello, World!";
std::string str(s);
Lưu ý rằng cấu trúc này sao chép sâu danh sách ký tự tại s
và s
không nên nullptr
, hoặc hành vi khác không được xác định.
str
chỉ là một tên biến. Nó có thể là bất cứ điều gì: S
, abc
, l
, I
, strHelloWorld
. Rõ ràng một số lựa chọn là tốt hơn so với những người khác. Nhưng đối với ví dụ str
này là khá chấp nhận được.
Nếu bạn đã biết kích thước của char *, hãy sử dụng thay thế
char* data = ...;
int size = ...;
std::string myString(data, size);
Điều này không sử dụng strlen.
EDIT: Nếu biến chuỗi đã tồn tại, hãy sử dụng gán ():
std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
Hầu hết các câu trả lời nói về xây dựng std::string
.
Nếu đã được xây dựng, chỉ cần sử dụng toán tử gán .
std::string oString;
char* pStr;
... // Here allocate and get character string (e.g. using fgets as you mentioned)
oString = pStr; // This is it! It copies contents from pStr to oString
Truyền nó qua hàm tạo:
const char* dat = "my string!";
std::string my_string( dat );
Bạn có thể sử dụng hàm string.c_str () để đi theo cách khác:
std::string my_string("testing!");
const char* dat = my_string.c_str();
c_str()
trở vềconst char*
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;
Tôi muốn đề cập đến một phương pháp mới sử dụng nghĩa đen do người dùng định nghĩa s
. Điều này không mới, nhưng nó sẽ phổ biến hơn vì nó đã được thêm vào Thư viện chuẩn C ++ 14.
Phần lớn là thừa trong trường hợp chung:
string mystring = "your string here"s;
Nhưng nó cho phép bạn sử dụng tự động, cũng với chuỗi rộng:
auto mystring = U"your UTF-32 string here"s;
Và đây là nơi nó thực sự tỏa sáng:
string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
Tôi vừa mới vật lộn với MSVC2005 để sử dụng hàm std::string(char*)
tạo giống như câu trả lời được xếp hạng cao nhất. Như tôi thấy biến thể này được liệt kê là số 4 trên http://en.cppreference.com/w/cpp/opes/basic_opes/basic_opes , tôi thậm chí còn nghĩ rằng một trình biên dịch cũ cung cấp điều này.
Tôi đã mất rất lâu để nhận ra rằng nhà xây dựng này tuyệt đối từ chối khớp với (unsigned char*)
như một đối số! Tôi đã nhận được các thông báo lỗi không thể hiểu này về việc không khớp với std::string
loại đối số, đây chắc chắn không phải là điều tôi đang hướng tới. Chỉ cần đưa ra lập luận với std::string((char*)ucharPtr)
giải quyết vấn đề của tôi ... duh!
char* data;
std::string myString(data);
data
vẫn chưa được khởi tạo (trống).
Không chắc chắn tại sao không có ai ngoài Erik đề cập đến điều này, nhưng theo trang này , toán tử gán chỉ hoạt động tốt. Không cần sử dụng hàm tạo, .assign () hoặc .append ().
std::string mystring;
mystring = "This is a test!"; // Assign C string to std:string directly
std::cout << mystring << '\n';
=
(và +=
). Nó dường như không xảy ra với những người như thế này, nhưng chỉ với char*
mọi thứ. Vấn đề liệu các báo cáo như vậy có thực sự bị rò rỉ hay không được thảo luận ở đây . Nhưng nếu tôi thay đổi gán cho destString = std::string(srcCharPtr);
các báo cáo rò rỉ valgrind đã biến mất. YMMV.
Constructs an object of class basic_string and determines its initial string value from the array
. Nó nói giá trị và không có gì về bộ đệm hoặc quyền sở hữu con trỏ.