Ben std::stringtarafı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::stringbir dizide mağazaya. Bu nasıl yapılabilir?
Ben std::stringtarafı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::stringbir 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 sve solmamalıdır nullptrya da başka bir davranışın tanımsız olduğunu unutmayın.
strsadece 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 striç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::stringArgü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);
databaş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.