Saya perlu menggunakan std::string
untuk menyimpan data yang diambil oleh fgets()
. Untuk melakukan ini, saya perlu mengubah nilai char*
kembali dari fgets()
menjadi std::string
menyimpan dalam array. Bagaimana ini bisa dilakukan?
Saya perlu menggunakan std::string
untuk menyimpan data yang diambil oleh fgets()
. Untuk melakukan ini, saya perlu mengubah nilai char*
kembali dari fgets()
menjadi std::string
menyimpan dalam array. Bagaimana ini bisa dilakukan?
Jawaban:
std::string
memiliki konstruktor untuk ini:
const char *s = "Hello, World!";
std::string str(s);
Perhatikan bahwa ini membangun salinan dalam daftar karakter di s
dan s
tidak boleh nullptr
, atau perilaku tidak terdefinisi.
str
hanyalah nama variabel. Bisa apa saja: S
, abc
, l
, I
, strHelloWorld
. Jelas beberapa pilihan lebih baik daripada yang lain. Tetapi untuk contoh str
ini cukup dapat diterima.
Jika Anda sudah tahu ukuran char *, gunakan ini sebagai gantinya
char* data = ...;
int size = ...;
std::string myString(data, size);
Ini tidak menggunakan strlen.
EDIT: Jika variabel string sudah ada, gunakan assign ():
std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
Sebagian besar jawaban berbicara tentang membangun std::string
.
Jika sudah dibangun, cukup gunakan operator penugasan .
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
Kirimkan melalui konstruktor:
const char* dat = "my string!";
std::string my_string( dat );
Anda dapat menggunakan fungsi string.c_str () untuk menuju ke arah lain:
std::string my_string("testing!");
const char* dat = my_string.c_str();
c_str()
kembaliconst char*
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;
Saya ingin menyebutkan metode baru yang menggunakan literal yang ditentukan pengguna s
. Ini bukan hal baru, tetapi akan lebih umum karena ditambahkan di Perpustakaan Standar C ++ 14.
Sangat berlebihan dalam kasus umum:
string mystring = "your string here"s;
Tetapi ini memungkinkan Anda untuk menggunakan otomatis, juga dengan string lebar:
auto mystring = U"your UTF-32 string here"s;
Dan di sinilah ia benar-benar bersinar:
string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
Saya baru saja berjuang dengan MSVC2005 untuk menggunakan std::string(char*)
konstruktor seperti jawaban berperingkat teratas. Seperti yang saya lihat varian ini terdaftar sebagai # 4 di http://en.cppreference.com/w/cpp/string/basic_string/basic_string yang selalu dipercaya , saya pikir bahkan kompiler lama menawarkan ini.
Butuh waktu lama bagi saya untuk menyadari bahwa konstruktor absolut ini menolak untuk cocok (unsigned char*)
sebagai argumen! Saya mendapat pesan kesalahan yang tidak dapat dipahami ini tentang kegagalan untuk mencocokkan dengan std::string
jenis argumen, yang jelas bukan yang saya tuju. Hanya melempar argumen dengan std::string((char*)ucharPtr)
memecahkan masalah saya ... ya!
char* data;
std::string myString(data);
data
tetap tidak diinisialisasi (kosong).
Tidak yakin mengapa tidak ada orang selain Erik yang menyebutkan ini, tetapi menurut halaman ini , operator penugasan berfungsi dengan baik. Tidak perlu menggunakan konstruktor, .assign (), atau .append ().
std::string mystring;
mystring = "This is a test!"; // Assign C string to std:string directly
std::cout << mystring << '\n';
=
(dan +=
). Sepertinya tidak terjadi dengan literal seperti ini, tetapi hanya dengan char*
hal - hal. Masalah apakah laporan tersebut benar - benar bocor dibahas di sini . Tetapi jika saya mengubah tugas untuk destString = std::string(srcCharPtr);
kebocoran valgrind laporan hilang. YMMV.
Constructs an object of class basic_string and determines its initial string value from the array
. Dikatakan nilai dan tidak ada tentang kepemilikan buffer atau pointer.