Wie konvertiere ich einen String in ein char-Array in C ++?


103

Ich möchte stringin charArray konvertieren , aber nicht char*. Ich weiß, wie man einen String konvertiert char*(indem mallocich ihn verwende oder wie ich ihn in meinem Code gepostet habe) - aber das ist nicht das, was ich will. Ich möchte einfach stringin ein char[size]Array konvertieren . Ist es möglich?

#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
Dies scheint C ++ zu sein, nicht C.
Fred Larson

@ FredLarson: ok, bearbeitet, danke
Brian Brown

3
mögliches Duplikat von std :: string zu char *
cegprakash

Antworten:


123

Der einfachste Weg, den ich mir vorstellen kann, ist:

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

Aus Sicherheitsgründen bevorzugen Sie vielleicht:

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

oder könnte auf diese Weise sein:

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

9
Der Haken dabei strncpyist, dass es nicht nullterminiert wird, wenn es die Größe erreicht, bevor es eine Null in der Quellzeichenfolge findet. Muss auch damit vorsichtig sein!
Fred Larson

1
Ja, ich denke, das ist ein vernünftiger Weg, um damit umzugehen.
Fred Larson

1
strncpy dient der Sicherheit, da strncpy den von Ihnen angegebenen Puffer nicht überschreitet. Auch strcpy_s ist nicht in C99, wurde aber kürzlich in C11 hinzugefügt.
Bames53

6
Ich mag die Art und Weise, wie Menschen das Wort Sicherheit missbrauchen ... oh, es gibt nicht genug Platz für die Zeichenfolge, also lassen Sie es uns abschneiden. Oh, wir haben versehentlich die Informationen über die lebensbedrohliche Arzneimittelallergie des Patienten entfernt. Aber wir haben keine ein Pufferüberlauf mehr. Nun, ich denke, es ist sicher ...
Karoly Horvath

4
@KarolyHorvath - Sicherheit in verschiedenen Bereichen. Natürlich müssen Sie Ihre funktionalen Anforderungen überprüfen und keine dummen Dinge tun. Wenn Sie jedoch den Puffer überschreiten, verlieren Sie die Garantie, zu wissen, was passieren wird. Durch die korrekte Codierung wird sichergestellt, dass das Programm auf Ihrem Betriebssystem "sicher" ausgeführt werden kann. Richtiges Denken stellt sicher, dass das Programm "sicher" ist, was der Benutzer benötigt.
Chowlett

58

Ok, ich bin schockiert, dass niemand wirklich eine gute Antwort gegeben hat, jetzt bin ich dran. Es gibt zwei Fälle;

  1. Ein konstantes char-Array ist gut genug für Sie, also gehen Sie mit,

    const char *array = tmp.c_str();
  2. Oder Sie müssen das char-Array so ändern, dass die Konstante nicht in Ordnung ist

    char *array = &tmp[0];

Beide sind nur Zuweisungsoperationen und meistens ist dies genau das, was Sie brauchen. Wenn Sie wirklich eine neue Kopie benötigen, folgen Sie den Antworten anderer Kollegen.


7
Er will ein Char-Array, kein Char *
Harogaston

10
Der Zeiger, den er erstellt hat, ist dasselbe wie ein char-Array. Eine Array-Variable in C und C ++ ist nur ein Zeiger auf das erste Element im Array.
JustinCB

@ JustinC.B. nicht wirklich! Array-Variablen können in Zeiger zerfallen , sind jedoch in C ++ nicht identisch. zB std::size(elem)in C ++ ist gut definiert, wann ein elemist, char arrayaber es kann nicht kompiliert werden, wann elemein char*oder ist const char*, Sie können es hier sehen
aniliitb10

16

Der einfachste Weg, dies zu tun, wäre dies

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

14
Die Arraygröße muss in C ++ eine Konstante zur Kompilierungszeit sein.
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)

Es ist besser, C in C ++ zu vermeiden, daher sollte std :: string :: copy die Wahl anstelle von strcpy sein .



5

Versuchen Sie es so, es sollte funktionieren.

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


2

Sie könnten strcpy()wie folgt verwenden:

strcpy(tab2, tmp.c_str());

Achten Sie auf Pufferüberlauf.


2

Wenn Sie die Größe der Zeichenfolge vorher nicht kennen, können Sie ein Array dynamisch zuweisen:

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

0

Nun, ich weiß, dass dies vielleicht eher dumm als und einfach ist, aber ich denke, es sollte funktionieren:

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

Nicht wirklich. Sie gehen nur davon aus, dass ndas nicht größer sein kann als b. Es würde abstürzen, wenn n>b. Verwenden Sie besser die strcpybereits bereitgestellte Funktion. Bearbeiten: In einigen Fällen ist es möglicherweise sogar besser zu verwenden, strcpy_sda es die Überprüfung auf NULL-Zeiger hinzufügt (wenn Ihre Plattform dies unterstützt)
Droidballoon

0

Wenn Sie C ++ 11 oder höher verwenden, würde ich empfehlen, std::snprintfüber std::strcpyoder std::strncpywegen seiner Sicherheit zu verwenden (dh Sie bestimmen, wie viele Zeichen in Ihren Puffer geschrieben werden können) und weil es die Zeichenfolge für Sie mit Null beendet (so) Sie müssen sich keine Sorgen machen). Es wäre so:

#include <string>
#include <cstdio>

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

In C ++ 17 haben Sie folgende Alternative:

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

std::string tmp = "cat";
char tab2[1024];
std::snprintf(tab2, std::size(tab2), "%s", tmp.c_str());
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.