string nach const char nach char array
-
Hallo,
ist es möglich, einen string nach const char umzuwandel und diesen dann in einen char array zu speichern?
Wie man einen String in eine const char Variable wandelt, weiß ich bereits
string Umwandlung; Umwandlung.c_str();
-
char *pArray = Umwandlung.c_str(); char c = pArray[0];
-
c_str() liefert dir keinen 'const char', sondern einen 'const char*' (ein Zeichen macht einen gewaltigen Unterschied - letzteres ist ein Zeiger auf ein char(-Array)). Wenn du die Daten nur lesen willst, reicht dieser Zeiger völlig aus. Wenn du wirklich eine Kopie in einem eigenständigen char-Array brauchst, kannst du
Umwandlung.copy(str,anzahl);verwenden (oder strcpy()).
-
Hallo B.D
wenn du sowas brauchst, dann kopiere dir am besten den char[] aus dem String.
char t[Umwandlung.length() + 1]; strncpy(t, Umwandlung.c_str(), Umwandlung.length());willst du die char's im string direkt manipulieren, (wovon dringend abzuraten ist) dann kannst du es so machen...
string Umwandlung = "Hallo"; cout << Umwandlung; char *t = const_cast<char*>(Umwandlung.c_str()); // sehr böser cast *t = 'h'; cout << Umwandlung;
-
zeigerzeiger schrieb:
Hallo B.D
wenn du sowas brauchst, dann kopiere dir am besten den char[] aus dem String.
char t[Umwandlung.length() + 1]; strncpy(t, Umwandlung.c_str(), Umwandlung.length());Ich bin mir sicher, das geht nicht einmal durch den Compiler (C++ hat afaik keine VLAs). Wenn du die Stringlänge nicht schon zur Compilezeit weißt bzw. nach oben abschätzen kannst, müsstest du den Speicher per new[] anfordern.
-
zeigerzeiger schrieb:
char t[Umwandlung.length() + 1]; strncpy(t, Umwandlung.c_str(), Umwandlung.length());Hm, irgendwie beissen sich hier Arrays variabler Länge (ein Feature von C99) und die Klasse std::string (C++98)

Ansonsten natürlich soweit korrekt, ausser dass ich memcpy nehmen würde, da Länge sowohl des Ziel- als auch des Quell-Arrays bekannt sind (str[n]cpy müsste bei jedem Zeichen aufs Nullbyte prüfen).
-
zeigerzeiger schrieb:
willst du die char's im string direkt manipulieren, (wovon dringend abzuraten ist) dann kannst du es so machen...
string Umwandlung = "Hallo"; cout << Umwandlung; char *t = const_cast<char*>(Umwandlung.c_str()); // sehr böser cast *t = 'h'; cout << Umwandlung;Ja, davon ist dringenst abzuraten. Schon weil c_str() nicht zwangsläufig einen Zeiger auf die Orginaldaten des Objekts zurückgeben muss.
-
CStoll schrieb:
zeigerzeiger schrieb:
Hallo B.D
wenn du sowas brauchst, dann kopiere dir am besten den char[] aus dem String.
char t[Umwandlung.length() + 1]; strncpy(t, Umwandlung.c_str(), Umwandlung.length());Ich bin mir sicher, das geht nicht einmal durch den Compiler (C++ hat afaik keine VLAs). Wenn du die Stringlänge nicht schon zur Compilezeit weißt bzw. nach oben abschätzen kannst, müsstest du den Speicher per new[] anfordern.
Jupp, da hast du natürlich recht... Mein Fehler
-
LordJaxom schrieb:
Ansonsten natürlich soweit korrekt, ausser dass ich memcpy nehmen würde, da Länge sowohl des Ziel- als auch des Quell-Arrays bekannt sind (str[n]cpy müsste bei jedem Zeichen aufs Nullbyte prüfen).
Und ich würde dafür copy() verwenden - das liefert der String schon mit

Wenn du wirklich einen variablen char-Zeiger auf deine Daten haben willst, würde ich '&str[0]' verwenden - aber das ist genauso problematisch wie der obige const_cast.
-
CStoll schrieb:
Und ich würde dafür copy() verwenden - das liefert der String schon mit

Klar, stimmt natürlich.
Ich neige immernoch in alte Verhaltensweisen zurückzufallen
-
Ah Danke.Das hat mir schon super geholfen.Jetzt müsste ich nur noch wissen,wie ich den Speicher eines Arrays freigeben kann, ohne direkt die Variable zu löschen.Wollte zuerst mit einer Schleife, jedem Speicherblock ein Leerzeichen übergeben (Array[i]= " ") aber da mekert er.
-
Welchen Speicher meinst du denn? Den hinter c_str() mußt du nicht freigeben, das macht der String schon selber (spätestens wenn er aus dem Scope fällt).
-
Ich habe einen char Array c[30] den ich zuvor den Inhalt des const Char name übergeben habe
char c[100]; int i=0; while(name[i]!='\0') { c[i]= name[i]; i++; }Nun würde ich gerne den Inhalt von c[100] löschen, ohne direkt die ganze Variable zu löschen.
-
Hi,
also ich würde das
- gar nicht machen. "Löschen" - was meinst Du damit ? Alle Chars auf '\0' setzen ? Speicher freigeben ? ... ?
Speicher freigeben kannst Du bei statischen Arrays gar nicht (außer durch Verlassen des Scopes). - kopieren nicht nachprogrammieren; Warum nicht einfach "copy ?
- Ansonsten: Einfach mit dynmischer Speicherverwaltung:
string name = "Irgendwas steht hier drin"; char* dynamischesArray; dynamischesArray = new char[name.length()+1]; // 0-Zeichen nicht vergessen // warum eine eigene Schleife, wenn es das schon gibt ? copy(name.begin(), name.end(), dynamischesArray); // Hier kann ich dynisches Array verwenden, wie ich will // ... ggf. Inhalt wieder in name zurückkopieren // ... und zum Schluss Speicher freigeben delete[] dynamischesArray;Aaaaaber: Kopie brauchst Du nur, wenn Du wirklich etwas ändern willst - ansonsten tut's auch name.c_str();
Gruß,
Simon2.
- gar nicht machen. "Löschen" - was meinst Du damit ? Alle Chars auf '\0' setzen ? Speicher freigeben ? ... ?
-
Also wenn ich es so mache
string name; while (getline(*pIFStream,name)) { char* dynamischesArray; dynamischesArray = new char[name.length()+1]; copy(name.begin(), name.end(), dynamischesArray); ShellExecute(0,"open",dynamischesArray,0,0,SW_SHOWNORMAL); delete[] dynamischesArray; }klappt es nicht.
Daher wollte ich es so machen:
char Adresse[30]; string name; while (getline(*pIFStream,name)) { char c[100]; int i=0; while(name[i]!='\0') { c[i]= name[i]; i++; } int j=2; int a=0; while (c[j]!='\0') { Adresse[a]=c[j]; j++; a++; } ShellExecute(0,"open",Adresse,0,0,SW_SHOWNORMAL); Sleep((c[0]*100)); for (int l=0;l<30;l++) { Adresse[l]=leer; // hier sollte freigegeben werden }Das Array soll gesplittet werden, da in der textdatei die zuvor eingelesen wird, die erste Stelle eine Zahl ist,die zweite eine leerzeile und ab der dritten kommt eine Internetseite.Da die Seiten allerdings unterschiedlich lang sind, kommt es schonmal vor,dass am Ende einer Seite noch zusätzliche Zeichen dranhängen. Beispiel: www.amazon.de= 13 Zeichen , www.ebay.de =11 Zeichen = www.ebay.dede
-
Was genau meinst du mit "klappt nicht"? Vermutlich hast du nur vergessen, die Null-Terminierung einzuarbeiten, bevor du das char-Array als C-String verwendet hast.
-
Mit klappt nicht meine ich, dass die Internetseite nicht aufgerufen wird.
Habe aber mal ein cout gemacht und festgestellt, dass wie du schon sagst, die Terminierung am Ende fehlt.Es werden nämlich hinter der Seite jede Menge @ ausgegeben.Aber kann ich das vom obigen Beispiel enthaltene dynamische Array genauso behandeln wie ein normales char Array,also auf die einzelnen Speicherblöcke zugreifen können?
-
B.D schrieb:
...kann ich das vom obigen Beispiel enthaltene dynamische Array genauso behandeln wie ein normales char Array,also auf die einzelnen Speicherblöcke zugreifen können?
Japp.
Der Speicher für das dynamische Array wurde nur anders besorgt - das Handling ist gleich.Gruß,
Simon2.
-
Kann mir jemand helfen den Terminator bei diesem Code einzufügen?Ich probiers und probiers aber krieg es einfach nich hin.Ich werd noch wahnsinnig

string name; while (getline(*pIFStream,name)) { char* dynamischesArray; dynamischesArray = new char[name.length()+1]; copy(name.begin(), name.end(), dynamischesArray); ShellExecute(0,"open",dynamischesArray,0,0,SW_SHOWNORMAL); delete[] dynamischesArray; }
-
Geht's nicht so ?
string name; while (getline(*pIFStream,name)) { char* dynamischesArray; dynamischesArray = new char[name.length()+1]; copy(name.begin(), name.end(), dynamischesArray); dynamischesArray[name.length()] = '\0'; // <--- ShellExecute(0,"open",dynamischesArray,0,0,SW_SHOWNORMAL); delete[] dynamischesArray; }
-
Ahhh ich danke dir.Du hast mich beruhigt

Die Zeile ist eigentlich logich,aber irgendwie fällt mir das nie ein.