std::string'den char*'a

Bir std::string veri türünü bir **char* veya char[]** veri türüne dönüştürmek istiyorum.

std::string str = "string";
char* chr = str;

Sonuçlar geldi: "error: cannot convert 'std::string' to 'char' ... ".

Bunu yapmak için hangi yöntemler mevcut?

Çözüm

Otomatik olarak dönüştürülmez (Tanrı'ya şükür). C string versiyonunu elde etmek için c_str() metodunu kullanmanız gerekecektir.

std::string str = "string";
const char *cstr = str.c_str();

Bir const char * döndürdüğüne dikkat edin; c_str() tarafından döndürülen C tarzı dizeyi değiştirmenize izin verilmez. Eğer onu işlemek istiyorsanız, önce kopyalamanız gerekir:

std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;

Ya da modern C++'da:

std::vector cstr(str.c_str(), str.c_str() + str.size() + 1);
Yorumlar (18)
  • Sadece aynı içeriği temsil eden C tarzı bir dize istiyorsanız:

      char const* ca = str.c_str();
  • Eğer new içerikli C tarzı bir string istiyorsanız, bunun bir yolu (derleme zamanında string boyutunu bilmediğiniz için) dinamik ayırmadır:

      char* ca = new char[str.size()+1];
      std::copy(str.begin(), str.end(), ca);
      ca[str.size()] = '\0';

    Daha sonra delete[] yapmayı unutmayın.

  • Bunun yerine statik olarak ayrılmış, sınırlı uzunlukta bir dizi istiyorsanız:

      size_t const MAX = 80; // maksimum karakter sayısı
      char ca[MAX] = {};
      std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca);

std::string` bu türlere örtük olarak dönüştürülmez, çünkü bunu yapmaya ihtiyaç duymak genellikle bir tasarım kokusudur. Buna gerçekten ihtiyacınız olduğundan emin olun.

Eğer bir `char*'a kesinlikle ihtiyaç duyuyorsanız, muhtemelen en iyi yol budur:

vector v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector
Yorumlar (15)

Girdi olarak geçmek için sadece C tarzı bir dizeye ihtiyacınız olduğunu varsayarsak:

std::string str = "string";
const char* chr = str.c_str();
Yorumlar (0)