web-dev-qa-db-fra.com

Comment convertir une chaîne en char array en C++?

Je voudrais convertir string à char tableau mais pas char*. Je sais comment convertir une chaîne en char* (en utilisant malloc ou la façon dont je l'ai publiée dans mon code) - mais ce n'est pas ce que je veux. Je veux simplement convertir string à char[size] tableau. C'est possible?

#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;
}
83
Brian Brown

Le moyen le plus simple auquel je puisse penser est le suivant:

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

Par sécurité, vous préférerez peut-être:

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

ou pourrait être de cette façon:

string temp = "cat";
char * tab2 = new char [temp.length()+1];
strcpy (tab2, temp.c_str());
104
Chowlett

Ok, je suis choqué que personne ne donne vraiment une bonne réponse, maintenant à mon tour. Il y a deux cas;

  1. Un tableau de caractères constant est assez bon pour vous alors vous allez avec, 

    const char *array = tmp.c_str();
    
  2. Ou vous avez besoin de modifier le tableau de caractères si constant n'est pas correct, alors allez simplement avec ceci 

    char *array = &tmp[0];
    

Tous les deux sont juste des opérations d’affectation et la plupart du temps, c’est exactement ce dont vous avez besoin. Si vous avez vraiment besoin d’une nouvelle copie, suivez les réponses données par d’autres boursiers.

48
rad

Le moyen le plus simple de le faire serait-ce

std::string myWord = "myWord";
char myArray[myWord.size()+1];//as 1 char space for null is also required
strcpy(myArray, myWord.c_str());
15
user2963410
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)

Il vaut mieux éviter le C en C++, donc std :: string :: copy devrait être le choix plutôt que strcpy.

9
Youka

Copiez simplement la chaîne dans le tableau avec strcpy.

6
David Schwartz

Essayez de cette façon, cela devrait être un travail. 

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

Essayez strcpy (), mais comme Fred l'a dit, c'est C++, pas C

4
Marrow Gnawer

Vous pouvez utiliser strcpy(), comme ceci:

strcpy(tab2, tmp.c_str());

Attention aux débordements de mémoire tampon.

2
Fred Larson

Si vous ne connaissez pas à l'avance la taille de la chaîne et que celle-ci peut varier considérablement, vous pouvez obtenir un tableau de taille fixe alloué dynamiquement avec la surcharge de tableau de unique_ptr:

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

Notez que vous n'avez pas besoin de strncpy ici car le tableau est alloué pour être suffisamment grand en premier lieu.

1
emlai

Si vous utilisez C++ 11 ou une version ultérieure, je vous conseillerais d'utiliser std::snprintf sur std::strcpy ou std::strncpy en raison de sa sécurité (vous déterminez le nombre de caractères pouvant être écrits). votre tampon) et parce qu’il met fin à la chaîne pour vous (pour que vous n’ayez pas à vous en préoccuper). Ce serait comme ça:

#include <string>
#include <cstdio>

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

En C++ 17, vous avez cette alternative:

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

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

Eh bien, je sais que c'est peut-être plutôt stupide que et simple, mais je pense que cela devrait fonctionner:

string n;
cin>> n;
char b[200];
for (int i = 0; i < sizeof(n); i++)
{
    b[i] = n[i];
    cout<< b[i]<< " ";
}
0
SquircKle