length - string to char array c++




std:: String zum char* (10)

Alternativ können Sie Vektoren verwenden, um ein beschreibbares Zeichen * zu erhalten, wie unten gezeigt;

//this handles memory manipulations and is more convenient
string str;
vector <char> writable (str.begin (), str.end) ;
writable .push_back ('\0'); 
char* cstring = &writable[0] //or &*writable.begin () 

//Goodluck  

Ich möchte eine std :: string in einen char * oder char [] Datentyp konvertieren.

std::string str = "string";
char* chr = str;

Ergebnisse in: "Fehler: kann 'std :: string' nicht in 'char' umwandeln ..." .

Welche Methoden gibt es dafür?


Angenommen, Sie benötigen nur eine Zeichenfolge im C-Stil, die als Eingabe übergeben wird:

std::string str = "string";
const char* chr = str.c_str();

Dies wird auch funktionieren

std::string s;
std::cout<<"Enter the String";
std::getline(std::cin, s);
char *a=new char[s.size()+1];
a[s.size()]=0;
memcpy(a,s.c_str(),s.size());
std::cout<<a;  

Eine sichere Version der char * -Antwort von orlp mit unique_ptr:

std::string str = "string";
auto cstr = std::make_unique<char[]>(str.length() + 1);
strcpy(cstr.get(), str.c_str());

Hier ist eine weitere robuste Version von Protocol Buffer

char* string_as_array(string* str)
{
    return str->empty() ? NULL : &*str->begin();
}

// test codes
std::string mystr("you are here");
char* pstr = string_as_array(&mystr);
cout << pstr << endl; // you are here

Sie können es mit Iterator machen.

std::string str = "string";
std::string::iterator p=str.begin();
char* chr = &(*p);

Viel Glück.


Vergessen Sie zur Vollständigkeit nicht std::string::copy() .

std::string str = "string";
const size_t MAX = 80;
char chrs[MAX];

str.copy(chrs, MAX);

std::string::copy() beendet NUL nicht. Wenn Sie einen NUL-Terminator für die Verwendung in C-String-Funktionen benötigen:

std::string str = "string";
const size_t MAX = 80;
char chrs[MAX];

memset(chrs, '\0', MAX);
str.copy(chrs, MAX-1);

Wenn ich eine veränderliche rohe Kopie eines C ++ - String-Inhalts benötigen würde, würde ich Folgendes tun:

std::string str = "string";
char* chr = strdup(str.c_str());

und später:

free(chr); 

Warum spiele ich nicht mit std :: vector oder new [] wie jeder andere? Weil, wenn ich eine veränderliche C-artige rohe Zeichenkette * brauche, dann, weil ich C-Code aufrufen möchte, der die Zeichenkette ändert, und C-Code mit free () freigibt und mit malloc () zuordnet (strdup verwendet malloc) . Wenn ich also meine rohe Zeichenkette an eine in C geschriebene Funktion X übergebe , könnte sie eine Einschränkung für ihr Argument haben, das sie auf dem Heap zugewiesen werden muss (wenn die Funktion beispielsweise realloc für den Parameter aufrufen möchte). Aber es ist sehr unwahrscheinlich, dass ein Argument erwartet wird, das mit (einigen benutzerdefinierten) neuen []!


Weitere Details hier und here aber Sie können verwenden

string str = "some string" ;
char *cstr = &str[0u];

char* result = strcpy((char*)malloc(str.length()+1), str.c_str());






char