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;
}
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());
Ok, je suis choqué que personne ne donne vraiment une bonne réponse, maintenant à mon tour. Il y a deux cas;
Un tableau de caractères constant est assez bon pour vous alors vous allez avec,
const char *array = tmp.c_str();
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.
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());
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.
Copiez simplement la chaîne dans le tableau avec strcpy
.
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';
Essayez strcpy (), mais comme Fred l'a dit, c'est C++, pas C
Vous pouvez utiliser strcpy()
, comme ceci:
strcpy(tab2, tmp.c_str());
Attention aux débordements de mémoire tampon.
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.
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());
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]<< " ";
}