Konvertieren von string zu char*
-
Die Funktion c_str() gibt const char* zurück.
Du kannst keinen const char* in einen char* konvertieren.
Lg freeG
-
z-irgendwas schrieb:
Wenn ich es so machen will: char key = str.c_str();
bekomme ich immer die Fehlermeldung:invalid conversion from `const char' to `char*'Jup,
c_strgibt auchconst char*zurück, damit man nicht auf die Idee kommt, den String darüber verändern zu wollen. Solltest du das wollen, kannst du das z.B. so machen:vector<char> buffer(str.begin(), str.end()); char *key = &buffer[0];Aber eben nur, falls du
keywirklich verändern musst und die Veränderung nicht am String direkt vornehmen kannst.
Außerdem musst du danach die eventuellen Änderungen wieder auf den String zurückführen. Willst du dir das Herumkopieren sparen und bist risikobereit, vergisst du denvectorund arbeitest direkt mit&str[0]oderconst_cast<char*>(str.c_str()). Dies ist nicht standardkonform, funktioniert aber bei den meisten Implementierungen.Hast du indes z.B. eine C-Funktion, die einen
char*erwartet, wo du dir aber sicher bist, dass sie den String nicht verändert (wo der Autor also bei der const-correctness geschlafen hat), ist das einer der wenigen Anwendungsfälle fürconst_cast.
-
const char* kann ich nicht benutzen.
-
ich wil aus einem string, mit hilfe von substr(), ein zeichen auslesen und im nächsten durchgang das nächste usw. das zeichen muss dann leider in char* umgewandelt werden.eine andere möglichkeit wäre mir aber auch recht.
-
Hier ma der code
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <fstream>
#include <string>using namespace std;
void decrypt(char *secret, char* key)
{
char c;
char *k = key;
while((c = *secret) != 0)
{
*secret++ = (c-32) - ((*k)-64) + 32;
k = *(k+1) ? k+1 : key;
}
}
int main(...)
{
//variablen
int x = 0;
int y = 1;
string schluessel = "abcdefghijklmopqrstuvwxyz";
int laenge = schluessel.length();
string fast;
ofstream dat_aus;
string dateiname = "C:\\nachricht.txt";dat_aus.open(dateiname.c_str(), ios_base::out);
while(x != laenge)
{
//umwandlung
fast = schluessel.substr(x, y);
char *buffer = new char[1];
strcpy(buffer,fast.c_str());char *key = fast.c_str(); //Fegler!!!
//decrypt
char secret[100];
strcpy(secret, "Z]]_Y2ec%_hXH]P\%k_eS2OSW4n\\f+RJincNUS.QU_eLW].Ngn7F^.IY17XUSZZYmjJ");
decrypt(secret,key);//ausgabe und speichern
dat_aus << secret << "key: " << *key << endl;
cout << "Geheime Botschaft: " << secret << " key: " << *key << endl;
cout << x << endl;
//zähler
x++;
}dat_aus.close();
system("PAUSE");
return 0;
}
-
Die Schleife sieht mir falsch aus. Guck dir nochmal genau die
decrypt-Funktion an, speziell die Zeilek = *(k+1) ? k+1 : key;.
Das ginge mit deinem 1-Zeichen-Buffer schön in die Hose.Was willst du eigentlich machen? Alle Kleinbuchstaben als Schlüssel durchprobieren? Der Schlüssel wird aber sehr wahrscheinlich aus mehreren Buchstaben bestehen.
-
Die decrypt function ist geklaut aus einem einstellungstest von GData.Du hast recht, ich will wirklich aus einem schlüssel alle buchstaben ausprobieren, und die schleife hat bis jetzt noch immer funktioniert
-
Ok, bevor du dich bei G-DATA einstellen lässt, solltest du dich erstmal ein wenig mehr mit C- und C++-Strings beschäftigen. Die Decrypt-Funktion ist ein wunderschönes Beispiel für eine reine C-Funktion, die du hier versuchst mit C++-Mitteln zu mischen. Damit gibt es natürlich Probleme. Da du außerdem noch zu wenig mit C-Strings vertraut bist, hast du hier sogar undefiniertes Verhalten (du übergibst im Endeffekt einen Zeiger auf einen
char, wo eigentlich ein C-String mit Nullterminierung gefordert ist). Ich denke auch, dass es wenig bringt, die Komplettlösung dir einfach nur vorzusetzen.PS: ein Tipp: der gesuchte Schlüssel besteht ausschließlich aus Großbuchstaben.
-
Ich probiere nicht mich dort einstellen zu lassen(bin erst 14). Ich weiss auch das ich einen zeiger an eine char übergeben will(soweit bin ich per google auch schon gekommen), was eigentlich unnötig ist, denn ich könnte den code ja auch einfach umschreiben(ich kann zwar net all zuviel c/c++ , aber das würde ich hinkriegen).ich möchte nur wissen, ob und wie es möglich ist einen string an einen char* zu übergeben.
-
z-irgendwas schrieb:
Ich probiere nicht mich dort einstellen zu lassen(bin erst 14). Ich weiss auch das ich einen zeiger an eine char übergeben will(soweit bin ich per google auch schon gekommen), was eigentlich unnötig ist, denn ich könnte den code ja auch einfach umschreiben(ich kann zwar net all zuviel c/c++ , aber das würde ich hinkriegen).ich möchte nur wissen, ob und wie es möglich ist einen string an einen char* zu übergeben.
Um es wirklich korrekt zu machen, müsstest du eine Kopie anlegen. Zum Beispiel so wie ipsec es dir gezeigt hat. Plus ein weiteres Nullzeichen noch anhängen (
buffer.push_back('\0');zwischen den beiden Anweisungen).
-
oh, hatte ich im eifer des gefechts übersehen
-
const_cast<char*>(str.c_str()) hatt tatsächlich funktioniert.
vielen dank leute(besonders an ipsec)
-
z-irgendwas schrieb:
const_cast<char*>(str.c_str()) hatt tatsächlich funktioniert.
vielen dank leute(besonders an ipsec)Aua. Hast du mal durchgelesen, was ipsec zu dieser Methode geschrieben hat? Das ist ein schlimmer Hack für ganz Hartgesottene die genau wissen auf was sie sich da einlassen (z.B. ipsec). Oder für Leute die nicht wissen was sie tun und später ganz furchtbare Bugs produzieren wollen (z.B. dich).
-
ja das hab ich mir durchgelesen, no risk no fun.
für container und templates muss ich noch ein bisschen was dazulernen;)