Bagaimana cara mengubah array char menjadi sebuah string?


254

Mengkonversi C ++ stringke array char cukup mudah menggunakan c_strfungsi string dan kemudian lakukan strcpy. Namun, bagaimana cara melakukan yang sebaliknya?

Saya memiliki array char seperti: char arr[ ] = "This is a test";untuk dikonversi kembali ke: string str = "This is a test.

Jawaban:


369

The stringkelas memiliki konstruktor yang mengambil C-string NULL-dihentikan:

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
Masih akan bekerja baik. Operator penugasan berlebih mengambil a const char*, sehingga Anda bisa meneruskannya dengan string literal atau char array (yang meluruh ke sana).
Mysticial

3
@ kingsmasher1: Sebenarnya, string dalam formulir "hello world" adalah array. Jika Anda menggunakannya sizeof("hello world")akan memberi Anda ukuran array (yaitu 12), daripada ukuran pointer (kemungkinan 4 atau 8).
dreamlax

7
Perhatikan bahwa ini hanya bekerja untuk konstan NULL-dihentikan C-string. The stringkonstruktor tidak akan bekerja dengan, misalnya, argumen string berlalu dinyatakan sebagai unsigned char * buffer, sesuatu yang sangat umum dalam menangani aliran byte perpustakaan.
CXJ

4
Tidak perlu sesuatu menjadi konstan. Jika Anda memiliki buffer byte jenis char apa pun, Anda dapat menggunakan konstruktor lain:, std::string str(buffer, buffer+size);tetapi mungkin lebih baik untuk tetap menggunakan std::vector<unsigned char>dalam kasus itu.
R. Martinho Fernandes

2
Meskipun mungkin jelas: stradalah tidak seorang mualaf-fungsi di sini. Ini adalah nama variabel string. Anda dapat menggunakan nama variabel lainnya (mis string foo(arr);.). Konversi dilakukan oleh konstruktor std :: string yang disebut secara implisit.
Christopher K.

55

Solusi lain mungkin terlihat seperti ini,

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

yang menghindari menggunakan variabel tambahan.


Bisakah Anda menunjukkan dalam jawaban bagaimana ini berbeda dari jawaban yang diterima Misticial saya?
Maarten Bodewes

@owlstead silakan lihat hasil edit. Saya hanya meletakkan jawaban saya karena itulah yang saya harap saya lihat ketika saya pertama kali menemukan halaman ini mencari jawaban. Jika seseorang sama bodohnya dengan saya ketika melihat halaman ini tetapi tidak dapat membuat koneksi dari melihat jawaban pertama, saya berharap jawaban saya akan membantu mereka.
stackPusher

5
Karena string () adalah konstruktor dari std :: string, mungkin perlu disebutkan bahwa Anda perlu menambahkan namespace std jika Anda tidak menggunakan std namespace. Contoh:cout << "test:" + std::string(arr);
Christopher K.

1
@ChristopherK. Saya meninggalkan itu karena begitu pula jawaban teratas. Jawaban saya dimaksudkan sebagai pelengkap dari jawaban itu jadi saya menyimpan asumsi yang sama. Semoga siapa pun yang tidak mengerti akan melihat komentar Anda
stackPusher

Apakah str nama variabel atau kunci di sini bisa saya gunakan string aString(someChar);?
Driss Bounouar

31

Ada masalah kecil yang terlewat dalam jawaban terpilih. Yaitu, array karakter dapat berisi 0. Jika kita akan menggunakan konstruktor dengan parameter tunggal seperti yang ditunjukkan di atas, kita akan kehilangan beberapa data. Solusi yang mungkin adalah:

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

Output adalah:

123
123 123


2
Ini adalah jawaban yang lebih baik jika Anda menggunakan std::stringsebagai wadah untuk data biner dan tidak dapat memastikan bahwa array tidak mengandung '\ 0'.
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 LUAR:

H : is a char array beginning with 17 chars long

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

Di mana gratis (tmp)? apakah string menangani itu?
huseyin tugrul buyukisik

1
Pertanyaan bagus. Saya pikir gratis harus ada di sana karena saya menggunakan malloc.
Cristian
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.