C++ ascii-Werte einer Buchstabenfolge potenzieren

ghostd

Cadet 4th Year
Registriert
Juni 2008
Beiträge
66
Hallo,

für ein simples Verschlüsselungsprojekt, möchte ich die dezimalen ascii-Werte einer Buchstabenfolge mit einer natürlichen Zahl potenzieren und das Ergebnis ausgeben.

Ich habe schon eine Möglichkeit gefunden, um die ascii-Werte, bzw. das Ergebnis aus einfachen Rechnungen mit ihnen auszugeben (im Beispiel wird zu den Werten 30 addiert). Zur Potenzierung würde sich ja nun die pow-Funktion anbieten, allerdings funktioniert diese nur mit double Werten. Wie kann ich nun str[j] zu einem double umwandeln? Macht das überhaupt Sinn?



Code:
char str[1024];
int j=0;
printf("Nachricht: "); 
scanf("%s",str);
printf("Verschluesselte Nachricht: "); 
	while(str[j])
	printf("%d ", str[j++] + 30);


Für "hallo" wird mir damit

134 127 138 138 141

ausgegeben.


Viele Grüße

Marcel
 
Das Stichwort ist hier casten. Du bekommst bei str[j] einen Integer wert und den musst du in ein Double Casten um pow nutzen zu können. static_cast< double >(str[j++]) sollte das für dich machen.
 
Hallo,
ich habe Umbels Befehl nun (hoffentlich an der richtigen Stelle) eingefügt, allerdings wird das "pow" nun Rot unterstrichen.

Code:
char str[1024];
int j=0;
printf("Nachricht: ");
scanf("%s",str);
printf("Verschluesselte Nachricht: "); 
static_cast< float >(str[j++]);
              while(str[j])
	printf("%f ", pow(str[j++], e));
 
Zuletzt bearbeitet:
Denk mal scharf nach was "str[j++]" für einen Datentyp hat.

Und woher bekommst du die Variable e?
 
Hallo,

habe den Datentyp nun geändert.

e wird in der Hauptfunktion abgefragt und ist ein Integer. Wenn ich dessen Wert in eine double-Variable übergebe, läuft das Ganze.

Was ich leider noch vergessen habe zu erwähnen:
mit den Potenzen soll noch eine Modulooperation durchgeführt werden, was aber nun natürlich nicht klappt, weil die Ausgabe ein double-Wert ist. Ließe sich das Ergebnis der Operation "pow(str[j++], e)"innerhalb der printf-Funkion in einen Integer umwandeln?
 
Zuletzt bearbeitet:
Du wirst (zusätzlich?) auf noch ein Problem stossen: char ist (üblicherweise!) eine 8-bit Variable, in deinem Fall signed, d.h. mit einem Wertebereich von −128 bis 127. Da dürfest Du schon ziemlich schnell Probleme bekommen, wenn dein Exponent >= 2 ist. :evillol:

Mögliche Lösung: Als Integer abspeichern... oder aber eine sinnvollere Art der "Verschlüsselung" wählen.
 
Ich glaube, du suchst weniger nach Double-Werten und der potentiell no pun intended ungenauen pow-Funktion, sondern eher so etwas wie eine kombinierte powmod-Funktion.

Man muss es natürlich nicht gleich kompliziert machen. Ein erster Schritt wäre, ausschließlich mit Integern zu arbeiten (bei Bedarf auch 64 Bit-Integer - Double ist bei Integern nur bis 52 Bit exakt, und pow kann immer ungenau sein). Potenzen von Integern selbst berechnen ist trivial, solange die nicht zu groß werden und solange man keinen übermäßig großen Wert auf Effizienz legt.

Bei deiner aktuellen Lösung würde es reichen, das Ergebnis von pow einfach in einen int zu casten. Also quasi
Code:
int a = static_cast<int>(pow(b, e));
Aber wie gesagt, so viele Typecasts sind sehr dreckig und möglicherweise treten dabei Rechenfehler auf.
 
Mit der Funktion fmod konnte ich mein Problem erst mal lösen, wobei ich VikingGes Vorschlag weiterverfolgen werde.

Nochmals vielen Dank für alle Anworten!

Viele Grüße
 
Zurück
Oben