Bagaimana cara mengubah string menjadi array karakter di C ++?

103

Saya ingin mengonversi stringke chararray tetapi tidak char*. Saya tahu cara mengonversi string menjadi char*(dengan menggunakan mallocatau cara saya mempostingnya di kode saya) - tetapi bukan itu yang saya inginkan. Saya hanya ingin mengonversi stringke char[size]array. Apa itu mungkin?

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

int main()
{
    // char to string
    char tab[4];
    tab[0] = 'c';
    tab[1] = 'a';
    tab[2] = 't';
    tab[3] = '\0';
    string tmp(tab);
    cout << tmp << "\n";

    // string to char* - but thats not what I want

    char *c = const_cast<char*>(tmp.c_str());
    cout << c << "\n";

    //string to char
    char tab2[1024];
    // ?

    return 0;
}
Brian Brown
sumber
12
Ini tampaknya C ++, bukan C.
Fred Larson
@FredLarson: oke, diedit, terima kasih
Brian Brown
3
kemungkinan duplikat dari std :: string ke char *
cegprakash

Jawaban:

123

Cara paling sederhana yang dapat saya pikirkan untuk melakukannya adalah:

string temp = "cat";
char tab2[1024];
strcpy(tab2, temp.c_str());

Demi keamanan, Anda mungkin lebih suka:

string temp = "cat";
char tab2[1024];
strncpy(tab2, temp.c_str(), sizeof(tab2));
tab2[sizeof(tab2) - 1] = 0;

atau bisa dengan cara ini:

string temp = "cat";
char * tab2 = new char [temp.length()+1];
strcpy (tab2, temp.c_str());
Chowlett
sumber
9
Hasil tangkapan dengan strncpyadalah bahwa itu tidak akan berhenti nol jika mencapai ukuran sebelum menemukan nol dalam string sumber. Harus hati-hati juga!
Fred Larson
1
Ya, saya pikir itu cara yang masuk akal untuk menanganinya.
Fred Larson
1
strncpy adalah untuk keamanan karena strncpy tidak akan membanjiri buffer yang Anda berikan. Juga strcpy_s tidak ada di C99, tetapi baru-baru ini ditambahkan di C11.
bames53
6
Saya suka cara orang menyalahgunakan kata keselamatan ... oh, tidak ada cukup ruang untuk string itu, jadi mari kita potong saja .. oh, kami tidak sengaja menghapus info tentang alergi obat yang mengancam nyawa pasien .. tapi kami tidak punya buffer dibanjiri lagi. Yah, kurasa itu aman ...
Karoly Horvath
4
@Karolyorv - keamanan di berbagai domain. Jelas, Anda perlu memeriksa persyaratan fungsional Anda dan Not Do Stupid Things. Tetapi jika Anda membanjiri buffer, Anda kehilangan jaminan untuk mengetahui apa yang akan terjadi. Pengkodean yang benar memastikan program "aman" untuk dijalankan di OS Anda. Pemikiran yang benar memastikan program "aman" dalam melakukan apa yang dibutuhkan pengguna.
Chowlett
58

Ok, saya kaget karena tidak ada yang benar-benar memberikan jawaban yang baik, sekarang giliran saya. Ada dua kasus;

  1. Sebuah array konstan arang cukup baik untuk Anda sehingga Anda pergi dengan,

    const char *array = tmp.c_str();
  2. Atau Anda perlu memodifikasi array karakter sehingga konstanta tidak ok, maka lakukan saja ini

    char *array = &tmp[0];

Keduanya hanyalah operasi penugasan dan sebagian besar waktu itulah yang Anda butuhkan, jika Anda benar-benar membutuhkan salinan baru maka ikuti jawaban orang lain.

rad
sumber
7
Dia ingin char array, bukan char *
harogaston
10
Pointer yang dia buat sama dengan array karakter. Variabel array dalam C dan C ++ hanyalah penunjuk ke elemen pertama dalam array.
JustinCB
@ JustinC.B. tidak juga! variabel array mungkin membusuk menjadi pointer tetapi tidak sama di C ++. misalnya std::size(elem)di C ++ didefinisikan dengan baik kapan elemadalah a char arraytetapi gagal untuk dikompilasi ketika elemadalah char*atau const char*, Anda dapat melihatnya di sini
aniliitb10
16

Cara termudah untuk melakukannya adalah ini

std::string myWord = "myWord";
char myArray[myWord.size()+1];//as 1 char space for null is also required
strcpy(myArray, myWord.c_str());
Komunitas
sumber
14
Ukuran array harus berupa konstanta waktu kompilasi dalam C ++.
interjay
12
str.copy(cstr, str.length()+1); // since C++11
cstr[str.copy(cstr, str.length())] = '\0';  // before C++11
cstr[str.copy(cstr, sizeof(cstr)-1)] = '\0';  // before C++11 (safe)

Lebih baik menghindari C dalam C ++, jadi std :: string :: copy harus menjadi pilihan daripada strcpy .

Youka
sumber
6

Cukup salin string ke dalam array dengan strcpy.

David Schwartz
sumber
5

Coba cara ini seharusnya berhasil.

string line="hello world";
char * data = new char[line.size() + 1];
copy(line.begin(), line.end(), data);
data[line.size()] = '\0'; 
Tharindu Dhanushka
sumber
4

Coba strcpy (), tetapi seperti yang dikatakan Fred, ini C ++, bukan C

Sumsum Penggerek
sumber
2

Anda bisa menggunakan strcpy(), seperti ini:

strcpy(tab2, tmp.c_str());

Hati-hati dengan buffer overflow.

Fred Larson
sumber
2

Jika Anda tidak mengetahui ukuran string sebelumnya, Anda dapat mengalokasikan array secara dinamis:

auto tab2 = std::make_unique<char[]>(temp.size() + 1);
std::strcpy(tab2.get(), temp.c_str());
emlai
sumber
0

Saya tahu ini mungkin agak bodoh daripada dan sederhana, tetapi saya pikir itu harus berhasil:

string n;
cin>> n;
char b[200];
for (int i = 0; i < sizeof(n); i++)
{
    b[i] = n[i];
    cout<< b[i]<< " ";
}
SquircKle
sumber
Yah, tidak juga. Anda hanya berasumsi bahwa ntidak boleh lebih dari b. Itu akan crash jika n>b. Lebih baik gunakan strcpyfungsi yang sudah disediakan. Sunting: Pada beberapa kasus mungkin lebih baik untuk digunakan strcpy_skarena menambahkan cek untuk NULL pointer (jika platform Anda mendukungnya)
droidballoon
0

Jika Anda menggunakan C ++ 11 atau lebih tinggi, saya sarankan menggunakan std::snprintfover std::strcpyatau std::strncpykarena keamanannya (yaitu, Anda menentukan berapa banyak karakter yang dapat ditulis ke buffer Anda) dan karena itu null-terminates string untuk Anda (jadi Anda tidak perlu khawatir tentang itu). Ini akan menjadi seperti ini:

#include <string>
#include <cstdio>

std::string tmp = "cat";
char tab2[1024];
std::snprintf(tab2, sizeof(tab2), "%s", tmp.c_str());

Di C ++ 17, Anda memiliki alternatif ini:

#include <string>
#include <cstdio>
#include <iterator>

std::string tmp = "cat";
char tab2[1024];
std::snprintf(tab2, std::size(tab2), "%s", tmp.c_str());
luizfls
sumber