Come convertire una stringa in un array di caratteri in C ++?


103

Vorrei convertire stringin chararray ma non char*. So come convertire la stringa in char*(usando malloco nel modo in cui l'ho pubblicata nel mio codice), ma non è quello che voglio. Voglio semplicemente convertire stringin char[size]array. È possibile?

#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;
}

12
Questo sembra essere C ++, non C.
Fred Larson

@FredLarson: ok, modificato, grazie
Brian Brown

3
possibile duplicato di std :: string in char *
cegprakash

Risposte:


123

Il modo più semplice in cui posso pensare di farlo è:

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

Per sicurezza, potresti preferire:

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

o potrebbe essere in questo modo:

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

9
Il strncpyproblema è che non terminerà con un valore nullo se raggiunge la dimensione prima di trovare un valore nullo nella stringa di origine. Devi stare attento anche con quello!
Fred Larson

1
Sì, penso che sia un modo ragionevole per gestirlo.
Fred Larson

1
strncpy è per la sicurezza in quanto strncpy non supererà il buffer che gli dai. Inoltre strcpy_s non è in C99, ma è stato aggiunto di recente in C11.
bames53

6
Adoro il modo in cui le persone abusano della parola sicurezza ... oh, non c'è abbastanza spazio per la stringa, quindi tronciamolo .. oh, abbiamo accidentalmente rimosso le informazioni sull'allergia ai farmaci potenzialmente letale del paziente .. ma non abbiamo più un sovraccarico del buffer. beh, immagino sia sicuro ...
Karoly Horvath

4
@KarolyHorvath - sicurezza in diversi domini. Ovviamente, devi controllare i tuoi requisiti funzionali e non fare cose stupide. Ma se superi il buffer perdi ogni garanzia di sapere cosa succederà. Una corretta codifica garantisce che il programma sia "sicuro" da eseguire sul tuo sistema operativo. Il pensiero corretto garantisce che il programma sia "sicuro" nel fare ciò di cui l'utente ha bisogno.
Chowlett

58

Ok, sono scioccato che nessuno abbia davvero dato una buona risposta, ora tocca a me. Ci sono due casi;

  1. Un array di caratteri costante è abbastanza buono per te, quindi vai con,

    const char *array = tmp.c_str();
  2. Oppure devi modificare l'array di caratteri in modo che la costante non sia ok, quindi vai con questo

    char *array = &tmp[0];

Entrambe sono solo operazioni di assegnazione e il più delle volte è proprio ciò di cui hai bisogno, se hai davvero bisogno di una nuova copia, segui le risposte di altri compagni.


7
Vuole un array di caratteri, non un carattere *
harogaston

10
Il puntatore che ha creato è la stessa cosa di un array di caratteri. Una variabile di matrice in C e C ++ è solo un puntatore al primo elemento della matrice.
JustinCB

@ JustinC.B. non proprio! le variabili array potrebbero decadere in puntatori ma non sono le stesse in C ++. ad esempio std::size(elem)in C ++ è ben definito quando elemè a char arrayma non riesce a compilare quando elemè a char*o const char*, puoi vederlo qui
aniliitb10

16

Il modo più semplice per farlo sarebbe questo

std::string myWord = "myWord";
char myArray[myWord.size()+1];//as 1 char space for null is also required
strcpy(myArray, myWord.c_str());

14
La dimensione dell'array deve essere una costante del tempo di compilazione in 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)

È una pratica migliore evitare il C in C ++, quindi std :: string :: copy dovrebbe essere la scelta invece di strcpy .



5

Prova in questo modo dovrebbe funzionare.

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


2

Potresti usare strcpy(), in questo modo:

strcpy(tab2, tmp.c_str());

Attenzione all'overflow del buffer.


2

Se non conosci in anticipo la dimensione della stringa, puoi allocare dinamicamente un array:

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

0

Beh, so che questo forse piuttosto stupido che e semplice, ma penso che dovrebbe funzionare:

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

Beh, non proprio. Stai solo supponendo che nnon possa essere più grande di b. Andrebbe in crash se n>b. Meglio utilizzare la strcpyfunzione già fornita. Modifica: in alcuni casi potrebbe essere ancora meglio da usare strcpy_sin quanto aggiunge il controllo per i puntatori NULL (se la tua piattaforma lo supporta)
droidballoon

0

Se stai usando C ++ 11 o versioni successive, ti suggerirei di usare std::snprintfover std::strcpyo std::strncpyper la sua sicurezza (cioè, tu determini quanti caratteri possono essere scritti nel tuo buffer) e perché termina con null la stringa per te (quindi non devi preoccuparti di questo). Sarebbe così:

#include <string>
#include <cstdio>

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

In C ++ 17, hai questa alternativa:

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

std::string tmp = "cat";
char tab2[1024];
std::snprintf(tab2, std::size(tab2), "%s", tmp.c_str());
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.