Ben std::string
tarafından alınan veri depolamak için bir kullanmanız gerekir fgets()
. Dönüştürmek için bu ben gereğini yapmak için char*
dönüş değeri fgets()
bir içine std::string
bir dizide mağazaya. Bu nasıl yapılabilir?
Ben std::string
tarafından alınan veri depolamak için bir kullanmanız gerekir fgets()
. Dönüştürmek için bu ben gereğini yapmak için char*
dönüş değeri fgets()
bir içine std::string
bir dizide mağazaya. Bu nasıl yapılabilir?
Yanıtlar:
std::string
bunun için bir kurucu var:
const char *s = "Hello, World!";
std::string str(s);
Bu yapı, adres listesindeki karakter listesini derin kopyalar s
ve s
olmamalıdır nullptr
ya da başka bir davranışın tanımsız olduğunu unutmayın.
str
sadece değişken bir isimdir. Bu şey olabilir: S
, abc
, l
, I
, strHelloWorld
. Açıkçası bazı seçimler diğerlerinden daha iyidir. Ancak bu örnek str
için oldukça kabul edilebilir.
Karakter * boyutunu zaten biliyorsanız, bunun yerine bunu kullanın
char* data = ...;
int size = ...;
std::string myString(data, size);
Bu strlen kullanmaz.
EDIT: Dize değişkeni zaten varsa, ata () kullanın:
std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
Çoğu cevap inşa hakkında konuşuyor std::string
.
Önceden oluşturulmuşsa, yalnızca atama işlecini kullanı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
Yapıcıdan geçirin:
const char* dat = "my string!";
std::string my_string( dat );
Diğer yöne gitmek için string.c_str () işlevini kullanabilirsiniz:
std::string my_string("testing!");
const char* dat = my_string.c_str();
c_str()
dönerconst char*
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;
char* data;
stringstream myStreamString;
myStreamString << data;
string myString = myStreamString.str();
cout << myString << endl;
Kullanıcı tanımlı değişmez değeri kullanan yeni bir yöntemden bahsetmek istiyorum s
. Bu yeni bir şey değildir, ancak C ++ 14 Standart Kitaplığı'na eklendiğinden daha yaygın olacaktır.
Genel durumda büyük ölçüde gereksiz:
string mystring = "your string here"s;
Ancak, geniş dizelerle de otomatik kullanmanıza izin verir:
auto mystring = U"your UTF-32 string here"s;
Ve burada gerçekten parlıyor:
string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
MSVC2005 ile yapıcıyı std::string(char*)
en üst düzey cevap gibi kullanmak için mücadele ediyorum . Bu varyantın her zaman güvenilir http://en.cppreference.com/w/cpp/string/basic_string/basic_string üzerinde # 4 olarak listelendiğini gördüğüm gibi , eski bir derleyicinin bile bunu sunduğunu düşünüyorum.
Bu yapıcı mutlakının (unsigned char*)
bir argüman olarak eşleşmeyi reddettiğini fark etmem çok uzun sürdü ! std::string
Argüman türüyle uyuşmama ile ilgili bu anlaşılmaz hata mesajlarını aldım , ki bu kesinlikle amaçladığım şey değildi. Sadece tartışmayı std::string((char*)ucharPtr)
çözerek sorunumu çözdüm ... duh!
char* data;
std::string myString(data);
data
başlatılmamış olarak kalır (boş).
Erik'den başka kimsenin neden bundan bahsetmediğinden emin değilim, ancak bu sayfaya göre , atama operatörü gayet iyi çalışıyor. Yapıcı, .assign () veya .append () kullanmaya gerek yoktur.
std::string mystring;
mystring = "This is a test!"; // Assign C string to std:string directly
std::cout << mystring << '\n';
=
(ve +=
) "yeni" birinden kaynaklanan Valgrind ulaşılabilir blokları bildirmeyle ilgili sorunlar almaya başladım . Böyle bir değişmezle değil, sadece char*
şeylerle gerçekleşiyor gibi görünüyor . Bu tür raporların gerçekten sızıntı olup olmadığı konusu burada tartışılmaktadır . Ancak destString = std::string(srcCharPtr);
valgrind sızıntı raporlarına atamayı değiştirirsem gitti. YMMV.
Constructs an object of class basic_string and determines its initial string value from the array
. Tamponlar veya işaretçi sahipliği hakkında değer ve hiçbir şey söylemez.