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;
}
Brian Brown
quelle
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());
Chowlett
quelle
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.

rad
quelle
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());
Gemeinschaft
quelle
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 .

Youka
quelle
6

Kopieren Sie einfach den String in das Array mit strcpy.

David Schwartz
quelle
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'; 
Tharindu Dhanushka
quelle
4

Versuchen Sie strcpy (), aber wie Fred sagte, ist dies C ++, nicht C.

Marrow Gnawer
quelle
2

Sie könnten strcpy()wie folgt verwenden:

strcpy(tab2, tmp.c_str());

Achten Sie auf Pufferüberlauf.

Fred Larson
quelle
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());
Emlai
quelle
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]<< " ";
}
SquircKle
quelle
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());
luizfls
quelle