Comment convertir une chaîne en tableau de caractères en C ++?

103

Je voudrais convertir stringen chartableau mais pas char*. Je sais comment convertir une chaîne en char*(en utilisant mallocou de la manière dont je l'ai publiée dans mon code) - mais ce n'est pas ce que je veux. Je veux simplement convertir stringen 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;
}
Brian Brown
la source
12
Cela semble être C ++, pas C.
Fred Larson
@FredLarson: ok, édité, merci
Brian Brown
3
duplication possible de std :: string to char *
cegprakash

Réponses:

123

La façon la plus simple de le faire est:

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

Pour votre 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());
Chowlett
la source
9
Le hic avec strncpyest qu'il ne se terminera pas par null s'il atteint la taille avant de trouver un null dans la chaîne source. Je dois faire attention à ça aussi!
Fred Larson
1
Oui, je pense que c'est une façon raisonnable de gérer cela.
Fred Larson
1
strncpy est pour la sécurité dans la mesure où strncpy ne dépassera pas le tampon que vous lui donnez. De plus, strcpy_s n'est pas en C99, mais il a récemment été ajouté en C11.
bames53
6
J'adore la façon dont les gens abusent du mot sécurité ... oh, il n'y a pas assez de place pour la ficelle, alors tronquons-la ... oh, nous avons accidentellement supprimé les informations sur l'allergie médicamenteuse potentiellement mortelle du patient ... mais nous ne l'avons pas un dépassement de tampon plus. eh bien, je suppose que c'est sûr ...
Karoly Horvath
4
@KarolyHorvath - la sécurité dans différents domaines. De toute évidence, vous devez vérifier vos exigences fonctionnelles et ne pas faire de choses stupides. Mais si vous dépassez le tampon, vous perdez toute garantie de savoir ce qui va se passer. Un codage correct garantit que le programme peut être exécuté en toute sécurité sur votre système d'exploitation. Une réflexion correcte garantit que le programme est «sûr» de faire ce dont l'utilisateur a besoin.
Chowlett
58

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

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

    const char *array = tmp.c_str();
  2. Ou vous devez modifier le tableau de caractères pour que la constante ne soit pas correcte, alors allez-y simplement

    char *array = &tmp[0];

Les deux ne sont que 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 des autres boursiers.

rad
la source
7
Il veut un tableau de caractères, pas un caractère *
harogaston
10
Le pointeur qu'il a créé est la même chose qu'un tableau de caractères. Une variable de tableau en C et C ++ est juste un pointeur vers le premier élément du tableau.
JustinCB
@ JustinC.B. pas vraiment! les variables de tableau peuvent se désintégrer en pointeurs, mais elles ne sont pas identiques en C ++. par exemple std::size(elem)en C ++ est bien défini quand elemest a char arraymais il ne parvient pas à compiler quand elemest a char*ou const char*, vous pouvez le voir ici
aniliitb10
16

La façon la plus simple de le faire serait la suivante

std::string myWord = "myWord";
char myArray[myWord.size()+1];//as 1 char space for null is also required
strcpy(myArray, myWord.c_str());
Communauté
la source
14
La taille du tableau doit être une constante de compilation en C ++.
entre
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)

Il est préférable d'éviter C en C ++, donc std :: string :: copy devrait être le choix au lieu de strcpy .

Youka
la source
6

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

David Schwartz
la source
5

Essayez de cette façon, cela devrait fonctionner.

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

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

Rongeur de moelle
la source
2

Vous pouvez utiliser strcpy(), comme ceci:

strcpy(tab2, tmp.c_str());

Attention au débordement de la mémoire tampon.

Fred Larson
la source
2

Si vous ne connaissez pas au préalable la taille de la chaîne, vous pouvez allouer dynamiquement un tableau:

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

Eh bien , je sais que cela 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]<< " ";
}
SquircKle
la source
Eh bien pas vraiment. Vous supposez simplement que cela nne peut pas être plus grand que b. Il planterait si n>b. Mieux vaut utiliser la strcpyfonction déjà fournie. Edit: Dans certains cas, il peut être encore mieux d'utiliser strcpy_scar il ajoute la vérification des pointeurs NULL (si votre plate-forme le prend en charge)
droidballoon
0

Si vous utilisez C ++ 11 ou supérieur, je suggérerais d'utiliser std::snprintfover std::strcpyou en std::strncpyraison de sa sécurité (c'est-à-dire, vous déterminez combien de caractères peuvent être écrits dans votre tampon) et parce qu'il termine la chaîne par null (donc vous n'avez pas à vous en soucier). 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());
luizfls
la source