Char dizisini dizgeye nasıl dönüştürebilirim?


254

Bir C ++ ' stringı bir char dizisine dönüştürmek c_str, string fonksiyonunu kullanarak ve sonra yapıyor strcpy. Ancak bunun tam tersi nasıl yapılır?

Şuna benzer bir char dizisi var: char arr[ ] = "This is a test";geri dönüştürülecek string str = "This is a test.

Yanıtlar:


369

stringSınıf bir BOş sonlandırılmış C-string alan yapıcıya sahiptir:

char arr[ ] = "This is a test";

string str(arr);


//  You can also assign directly to a string.
str = "This is another string";

// or
str = arr;

2
Yine de her iki şekilde de çalışır. Aşırı yüklenmiş atama operatörü a alır const char*, böylece bir dize hazır bilgisi veya char dizisi iletebilirsiniz (buna bozulur).
Gizemli

3
@ kingsmasher1: Açıkçası, formda dizeleri "hello world" vardır diziler. Eğer kullanmak sizeof("hello world")oldukça bir işaretçi (muhtemelen 4 ya da 8) boyutundan daha size (12), dizinin büyüklüğü verecektir.
dreamlax

7
Bunun yalnızca NULL sonlandırılmış sabit C dizeleri için çalıştığını unutmayın . stringİle olmaz iş yapıcı örneğin bir argümanı dize olarak ilan unsigned char * buffer, bayt akışı kütüphaneleri ele çok yaygın bir şey.
CXJ

4
Hiçbir şeyin sabit olmasına gerek yoktur. Herhangi bir char türünde bir bayt tamponunuz varsa, diğer yapıcıyı kullanabilirsiniz: std::string str(buffer, buffer+size);ancak std::vector<unsigned char>bu durumda bir çubukla yapışmak daha iyidir .
R. Martinho Fernandes

2
Çok açık olabilir, ancak: strolduğu değil burada dönüştürme fonksiyonu. Dize değişkeninin adıdır. Başka bir değişken adı kullanabilirsiniz (örneğin string foo(arr);). Dönüştürme, örtük olarak adlandırılan std :: string yapıcısı tarafından yapılır.
Christopher K.

55

Başka bir çözüm şöyle görünebilir,

char arr[] = "mom";
std::cout << "hi " << std::string(arr);

ekstra değişken kullanmaktan kaçınır.


Cevapta bunun benim Misticial'ımın kabul edilen cevabından ne kadar farklı olduğunu söyleyebilir misiniz?
Maarten Bodewes

@owlstead lütfen düzenlemeye bakın. Sadece cevabımı koydum, çünkü bu sayfaya ilk kez bir cevap ararken geldiğimde gördüğüm şey bu. Benim gibi aptal biri bu sayfaya rastlarsa, ancak bu bağlantıyı ilk cevaba bakmadan yapamazsa, umarım cevabım onlara yardımcı olacaktır.
stackPusher

5
String () std :: string yapıcısı olduğundan, std ad alanını kullanmıyorsanız std ad alanını eklemeniz gerektiğini belirtmek gerekebilir. Örnek:cout << "test:" + std::string(arr);
Christopher K.

1
@ChristopherK. En yüksek puanlı cevabı da verdi çünkü bunu dışarıda bıraktım. Benim cevabım da aynı varsayımları koruduğum için bu cevaba ek demekti. Umarım bunu anlamayan herkes yorumunuzu
görecektir

Str değişken bir isim mi yoksa burada kullanabileceğim bir anahtar string aString(someChar);mı?
Driss Bounouar

31

En çok oy alan cevaplarda cevapsız küçük bir sorun var. Yani, karakter dizisi 0 içerebilir. Yukarıda belirtildiği gibi tek parametreli yapıcı kullanacaksak, bazı verileri kaybedeceğiz. Olası çözüm:

cout << string("123\0 123") << endl;
cout << string("123\0 123", 8) << endl;

Çıktı:

123
123 123


2
std::stringİkili veriler için bir kap olarak kullanıyorsanız ve dizinin '\ 0' içermediğinden emin olamıyorsanız , bu daha iyi bir yanıttır .
Assil Ksiksi

11
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string>

using namespace std;

int main ()
{
  char *tmp = (char *)malloc(128);
  int n=sprintf(tmp, "Hello from Chile.");

  string tmp_str = tmp;


  cout << *tmp << " : is a char array beginning with " <<n <<" chars long\n" << endl;
  cout << tmp_str << " : is a string with " <<n <<" chars long\n" << endl;

 free(tmp); 
 return 0;
}

DIŞARI:

H : is a char array beginning with 17 chars long

Hello from Chile. :is a string with 17 chars long

Ücretsiz (tmp) nerede? dize bununla ilgileniyor mu?
huseyin tugrul buyukisik

1
iyi soru. Bence serbest olmalı çünkü malloc kullanıyorum.
Cristian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.