Como converter string em array char em C ++?

103

Eu gostaria de converter stringpara chararray, mas não char*. Eu sei como converter string para char*(usando mallocou da maneira que postei no meu código) - mas não é isso que eu quero. Eu simplesmente quero converter stringpara char[size]array. É possível?

#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
fonte
12
Parece ser C ++, não C.
Fred Larson
@FredLarson: ok, editado, obrigado
Brian Brown
3
possível duplicata de std :: string para char *
cegprakash

Respostas:

123

A maneira mais simples que consigo pensar em fazer é:

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

Por segurança, você pode preferir:

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

ou poderia ser desta forma:

string temp = "cat";
char * tab2 = new char [temp.length()+1];
strcpy (tab2, temp.c_str());
Chowlett
fonte
9
O problema strncpyé que ele não terminará em null se atingir o tamanho antes de encontrar um null na string de origem. Tem que ter cuidado com isso também!
Fred Larson
1
Sim, acho que é uma maneira razoável de lidar com isso.
Fred Larson
1
strncpy é para segurança, pois strncpy não irá sobrecarregar o buffer que você fornecer. Strcpy_s também não está no C99, mas foi adicionado recentemente no C11.
bames53
6
Eu adoro a forma como as pessoas abusam da palavra segurança ... ah, não há espaço suficiente para o barbante, então vamos truncá-lo ... ah, removemos acidentalmente a informação sobre a alergia a medicamentos com risco de vida do paciente ... mas não temos uma saturação de buffer mais. bem, eu acho que é seguro ...
Karoly Horvath
4
@KarolyHorvath - segurança em diferentes domínios. Obviamente, você precisa verificar seus requisitos funcionais e não fazer coisas estúpidas. Mas se você ultrapassar o buffer, perderá qualquer garantia de saber o que acontecerá. A codificação correta garante que o programa seja "seguro" para ser executado em seu sistema operacional. O pensamento correto garante que o programa seja "seguro" para fazer o que o usuário precisa.
Chowlett
58

Ok, estou chocado que ninguém realmente deu uma boa resposta, agora é a minha vez. Existem dois casos;

  1. Uma matriz char constante é boa o suficiente para você, então você vai com,

    const char *array = tmp.c_str();
  2. Ou você precisa modificar o array char para que constante não esteja ok, então vá com isso

    char *array = &tmp[0];

Ambos são apenas operações de atribuição e na maioria das vezes é exatamente o que você precisa. Se você realmente precisa de uma nova cópia, siga as respostas de outros companheiros.

rad
fonte
7
Ele quer uma matriz char, não um char *
harogaston
10
O ponteiro que ele criou é a mesma coisa que um array char. Uma variável de array em C e C ++ é apenas um ponteiro para o primeiro elemento do array.
JustinCB 01 de
@ JustinC.B. Na verdade não! variáveis ​​de array podem se transformar em ponteiros, mas não são iguais em C ++. por exemplo, std::size(elem)em C ++ está bem definido quando elemé um, char arraymas não consegue compilar quando elemé um char*ou const char*, você pode vê-lo aqui
aniliitb10
16

A maneira mais fácil de fazer isso seria esta

std::string myWord = "myWord";
char myArray[myWord.size()+1];//as 1 char space for null is also required
strcpy(myArray, myWord.c_str());
Comunidade
fonte
14
O tamanho da matriz deve ser uma constante de tempo de compilação em C ++.
intervalo de
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)

É uma prática melhor evitar C em C ++, então std :: string :: copy deve ser a escolha em vez de strcpy .

Youka
fonte
6

Basta copiar a string para o array com strcpy.

David Schwartz
fonte
5

Tente desta forma que deve funcionar.

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

Tente strcpy (), mas como Fred disse, isso é C ++, não C

Roedor de medula
fonte
2

Você pode usar strcpy(), assim:

strcpy(tab2, tmp.c_str());

Cuidado com o estouro do buffer.

Fred Larson
fonte
2

Se você não souber o tamanho da string de antemão, poderá alocar dinamicamente uma matriz:

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

Bem, eu sei que isso pode ser mais idiota do que simples, mas acho que deve funcionar:

string n;
cin>> n;
char b[200];
for (int i = 0; i < sizeof(n); i++)
{
    b[i] = n[i];
    cout<< b[i]<< " ";
}
SquircKle
fonte
Bem, na verdade não. Você está apenas assumindo que nnão pode ser maior que b. Ele iria quebrar se n>b. Melhor usar a strcpyfunção já fornecida. Editar: Em alguns casos, pode ser ainda melhor usar strcpy_s, pois adiciona a verificação de ponteiros NULL (se sua plataforma suportar)
droidballoon
0

Se você estiver usando C ++ 11 ou superior, sugiro usar std::snprintfover std::strcpyou std::strncpypor causa de sua segurança (ou seja, você determina quantos caracteres podem ser gravados em seu buffer) e porque ele termina a string para você (então você não precisa se preocupar com isso). Seria assim:

#include <string>
#include <cstdio>

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

No C ++ 17, você tem esta alternativa:

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

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