Hoe reeks converteren naar char array in C++?

Ik wil stringconverteren naar chararray maar niet char*. Ik weet hoe ik reeks moet converteren naar char*(met behulp van mallocof de manier waarop ik het in mijn code heb gepost) – maar dat is niet wat ik wil. Ik wil gewoon stringconverteren naar char[size]array. Is het mogelijk?

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

Antwoord 1, Autoriteit 100%

Eenvoudigste manier waarop ik kan bedenken om het te doen is:

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

Voor de veiligheid heeft u de voorkeur:

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

of kan op deze manier zijn:

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

Antwoord 2, Autoriteit 43%

OK, ik ben geschokt dat niemand echt een goed antwoord gaf, nu mijn beurt. Er zijn twee gevallen;

  1. A Constant Char Array is goed genoeg voor jou, dus ga je mee,

    const char *array = tmp.c_str();
    
  2. Of je moet de char-array wijzigenzodat constant niet ok is, ga dan gewoon hiermee door

    char *array = &tmp[0];
    

Beide zijn slechts toewijzingshandelingenen meestal is dat precies wat je nodig hebt, als je echt een nieuw exemplaar nodig hebt, volg dan de antwoorden van andere fellows.


Antwoord 3, autoriteit 11%

De eenvoudigste manier om dit te doen is als volgt

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

Antwoord 4, autoriteit 10%

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)

Het is een betere gewoonte om C in C++ te vermijden, dus std::string::copyzou de keuze moeten zijn in plaats van strcpy.


Antwoord 5, autoriteit 4%

Kopieer de string gewoon naar de array met strcpy.


Antwoord 6, autoriteit 3%

Probeer het op deze manier, het zou moeten werken.

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

Antwoord 7, autoriteit 2%

Probeer strcpy(), maar zoals Fred al zei, dit is C++, niet C


Antwoord 8

Je zou strcpy()kunnen gebruiken, zoals:

strcpy(tab2, tmp.c_str());

Pas op voor bufferoverloop.


Antwoord 9

Als u de grootte van de tekenreeks niet van tevoren weet, kunt u dynamisch een array toewijzen:

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

Antwoord 10

Als je C++11 of hoger gebruikt, raad ik aan om std::snprintfte gebruiken boven std::strcpyof std::strncpyvanwege zijn veiligheid (dwz u bepaalt hoeveel tekens er naar uw buffer kunnen worden geschreven) en omdat het de tekenreeks voor u op nul beëindigt (zodat u zich er geen zorgen over hoeft te maken). Het zou als volgt zijn:

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

In C++17 heb je dit alternatief:

#include <string>
#include <cstdio>
#include <iterator>
std::string tmp = "cat";
char tab2[1024];
std::snprintf(tab2, std::size(tab2), "%s", tmp.c_str());

Antwoord 11

Nou, ik weet dat dit misschien nogal dom danen eenvoudig is, maar ik denk dat het zou moeten werken:

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

Other episodes