Caesar Verschlüsselung - Algorithmus für C++ ?

Ich hab mal nachgeschaut im Source Code.

Also mit der länge meine ich, die Länge der gespeicherten Daten.
Beim [] wird aber nicht überprüft, ob es eine Verletzung gibt. Mein Fehler sry.
Intern ist der string auch nur ein Array. Der hat am anfang eine gewisse größe (ich glaub je nach pc anders, aber passen schon recht viel zeichen rein). Und sobald man zuweit schreibt (also über die größe des Arrays hinaus) block die string Klasse das.

Ich hab jetzt nicht genauer nachgeschaut, wie die string klasse aufgebaut ist.
Wenn es dich interresiert, dann kannst du mal bei deinem include verzeichnis schauen,
da kannst du den ganzen source der stl anschauen.
 
@Flegmon

Ich versuche gerade das Programm mit dieser Variante zum Laufen zu bringen:

Code:
              for(i = 0; i < klartext.length(); i++)
              {
                geheimtext[i] = klartext[i] + 1;
              }

              cout << "Verschluesselte Nachricht lautet: " << geheimtext << endl;

Allerdings bekomme ich keine Ausgabe des Strings geheimtext, stattdessen eine Meldung
"main.cpp": W8012 Vergleich von signed- und unsigned-Werten in Funktion main() in Zeile 32".

Zeile 32 ist folgende:

Code:
              for(i = 0; i < klartext.length(); i++)

Ob dadurch nichts in den String geheimtext geschrieben wird?
Wie könnte man diesen Fehler beheben?


Zum include Verzeichnis und dem Source Code.
Ich kann dir da nur teilweise folgen, da stößt mein C++ Wissen leider schon an seine Grenzen. :(
Ich habe einen Blick in die header-Datei von string riskiert, kann aber nicht viel mit dem Inhalt anfangen.

Viele Grüße,
Cyraid
 
zu den headern,

wenn du dev-c++ benutzt, kannst du nich viel in dem header nachschauen, da dort der Zeilenumbruch nicht richtig angezeigt wird. Aber wenn du noch keine templates kennst,
bringt es dir sowieso noch nicht viel da zu schauen.

Zu deinem Problem. Die Meldung ist nur eine Warnung, es sollte trotzdem funktioniere.
Nutze lieber die Variante davor und setze die string nach jedem durchlauf zurück...
 
@Flegmon

Erstmal: Danke wieder für deine Antwort! :)

Ich benutze den C++ BuilderX. Die Header-Dateien werden mir mit Zeilenumbruch, also richtig, dargestellt. Ich verstehe allerdings trotzdem nicht sehr viel davon, nur sehr sehr vage.

Ich habe, wie du vorgeschlagen hast, wieder die vorherige Variante benutzt, die mit push_back(). Funktioniert auch einwandfrei, nur komme ich nun wieder an mein altes Problem..
Ich musste nämlich auch bei dieser Variante wieder auf ein paar Zeichen mittels [] zugreifen, um von 'z' zu 'a' zu kommen. Doch das funktioniert, wie oben schon, leider nicht.
So sieht meine for-Schleife zur Verschluesselung nun aus:

Code:
              for(i = 0; i < klartext.length(); i++)
              {
                if(klartext[i] == 'z')
                {
                  geheimtext[i] = 'a';
                }
                else
                {
                  if(klartext[i] == 'Z')
                  {
                    geheimtext[i] = 'A';
                  }
                  else
                  {
                    geheimtext.push_back(klartext[i] + 1);
                  }
                }
              }

Wenn ich bei dieser Variante ein 'z' eingebe passiert, so scheint es, im geheimtext String nichts.

Hier ein Auszug aus dem laufenden Programm:

Bitte zu entschluesselnde Nachricht (max. 50 Zeichen) eingeben:
abza
Verschluesselte Nachricht lautet: bcb

Wie du siehst, wird die Stelle mit dem 'z' bei der Verschlüsselung ganz übersprungen.
Wo steckt der Fehler?
Oder gibt es eine Möglichkeit das zu umgehen?

Viele Grüße,
Cyraid
 
Ich habs jetzt mal ausprobiert. Das problem is wirklich das, dass er intern die länge speichert. Hab aber einen sehr einfachen weg gefunden es zu umgehen. Man kann die länge nämlich manuel ändern.

Versuchs mal mit

geheimtext._Mysize++;

Code:
nach geheimtext[i] = 'A';
das könnte evtl. funktionieren

EDIT: da fällt mir ein, warum baust du nicht schon beim verschlüsseln folgendes ein:

C++:
if(klartext[i] == 'z')
  geheimtext.push_back('a');
else
 geheimtext.push_back(klartext[i]+1);
 
Zuletzt bearbeitet:
Beim geheimtext habe ich probiert die Funktion mysize zu verwenden, klappt aber nicht so richtig..
Da kommt bei mir eine Fehlermeldung.

Ist aber nicht weiter schlimm, denn dein anderer Vorschlag, bereits bei der If-Verzweigung push_back einzubauen klappt perfekt!
Aber erst einmal darauf kommen... ganz nach dem Motto:
Warum einfach, wenn es auch kompliziert geht? ;)


So, nun gibt es noch ein letztes kleines Problem.
(Der Thread nähert sich dem Ende ;) )
Damit die verschlüsselte Nachricht auch noch zu lesen ist und nicht gleich das Menü wieder kommt, habe ich folgendes eingebaut:

Code:
              cout << "\n\t- Beliebige Taste zum Fortfahren drücken -" << endl;
              cin  >> taste;

Die Variable "taste" ist eine integer Variable.
Das mit dem Taste drücken funktioniert damit allerdings nur begrenzt. Denn damit es weiter geht muss man eine Zahl eingeben und anschließend auf Enter drücken.
Was muss ich tun, damit man tatsächlich nur eine beliebige Taste drücken muss?

Viele Grüße,
Cyraid
 
Hi.
Flegmon hat gesagt.:
wenn du dev-c++ benutzt, kannst du nich viel in dem header nachschauen, da dort der Zeilenumbruch nicht richtig angezeigt wird.
Mit einem vernünftigen Editor werden die Dateien auch richtig angezeigt.
Flegmon hat gesagt.:
Ich habs jetzt mal ausprobiert. Das problem is wirklich das, dass er intern die länge speichert. Hab aber einen sehr einfachen weg gefunden es zu umgehen. Man kann die länge nämlich manuel ändern.

Versuchs mal mit
Code:
geheimtext._Mysize++;

nach geheimtext[i] = 'A';

das könnte evtl. funktionieren
Wozu soll das denn gut sein? (mal ganz abgesehen davon das es nicht funktionieren sollte - was benutzt du denn für einen Compiler?).

Die C++ std::string Klasse besitzt eine resize Methode. Das Richtige wäre also die beiden Strings auf die gleiche Länge zu bringen bevor du in die Schleife gehst.

Gruß
 
deepthroat hat gesagt.:
Die C++ std::string Klasse besitzt eine resize Methode. Das Richtige wäre also die beiden Strings auf die gleiche Länge zu bringen bevor du in die Schleife gehst.

Erst einmal danke für deine Antwort @deepthroat! :)

Du hast Recht, mit der resize Methode geht es.
Ich habe es ausprobiert. Man kann dadurch auf den String wie bei einem Array zugreifen.
So sieht das dann aus:

Code:
              geheimtext.resize(klartext.size());

              for(i = 0; klartext[i] != '\0'; i++)
              {
                if(klartext[i] == 'z')
                {
                  geheimtext[i] = 'a';
                }
                else
                {
                  if(klartext[i] == 'Z')
                  {
                    geheimtext[i] = 'A';
                  }
                  else
                  {
                    geheimtext[i] = klartext[i] + 1;
                  }
                }
              }

Damit hätten wir nun zwei Lösungen für mein bisheriges Problem ;)

Bleibt nur noch das letzte Problem übrig, siehe oben.

Viele Grüße,
Cyraid
 
@deepthroat

ich hab nur kurz mit dem notepad nen blick drüber geworfen.

ich benutze VC++ .net 2003 und hab nur ganz kurz geschaut, ob es mit [] wirklich nicht geht. mit _mySize hats funktioniert! Die resize methode hatte ich wohl übersehen und ansonsten arbeite ich nich viel mit der string klasse... aber naja war ja nur ein versuch


und zum Problem mit cin. Benutze doch getch() (conio.h), dass wartet auf einen Tastendruck
 
Cyraid hat gesagt.:
Damit die verschlüsselte Nachricht auch noch zu lesen ist und nicht gleich das Menü wieder kommt, habe ich folgendes eingebaut:

Code:
              cout << "\n\t- Beliebige Taste zum Fortfahren drücken -" << endl;
              cin  >> taste;

Die Variable "taste" ist eine integer Variable.
Das mit dem Taste drücken funktioniert damit allerdings nur begrenzt. Denn damit es weiter geht muss man eine Zahl eingeben und anschließend auf Enter drücken.
Was muss ich tun, damit man tatsächlich nur eine beliebige Taste drücken muss?
Das ist nicht so einfach zu sagen da die Antwort abhängig von der Umgebung (Betriebssystem/Terminal) ist. Aber unter Windows kannst du das Programm pause aufrufen:
C++:
cout << "Taste drücken..." << endl;
system("pause > nul");
Gruß
 
Zurück