Chiffrierung



  • @ Joe_M: Ich hab doch geschrieben, dass ich im gegensatz zu anderen nen totaler noob bin. Und meine Chiffrierung soll ja auch nicht "unknackbar" sein. Julius Caesar hat es zu seiner Zeit sogar als völlig ausreichend gefunden einfach nur alle Buchstaben des Alphabets drei stellen nach rechts zu verschieben (Cäsar-Chiffrierung). In deinem Code, finde ich aber den Fehler nicht.

    int iLength = Edit1->Text.Length();
    char* cText = new char[iLength + 1];
    strcpy(cText, Edit1->Text.c_str());
    for (int i = 0; i < iLength; i++)
    {
        if (cText[i] >= 'a' && cText[i] <  'y') // hier wird gesagt: Wenn der Wert
     //größer oder gleich 'a' und kleiner als 'z' 
            cText[i]++; // , soll der nächste Buchstabe gewählt werden
        if (cText[i] == 'z') und wenn der Buchstabe z ist
            cText[i] = 'a'; dann der Buchstabe durch a ersetzt werden.
    }
    Edit1->Text = AnsiString(cText);
    delete[] cText;
    

    Gut, man könnte unter den Zeilen von if noch Klammern setzen {}, aber das hilft nichts. 😞 Mit deinem Code kann ich ja auch nicht z.B. willkürlich vertauschen.
    Wenn ich ne Liste davon anlege funztes auch nicht

    if (cText[i] == 'a') 
        {    cText[i] = 'b'; }
    ...
    if (cText[i] == 'z') 
        {    cText[i] = 'a'; }
    

    Vielleicht, weis ja jemand anderes, wie ich das hinbekommen könnte. 🙄



  • Der Fehler ist eigentlich recht dumm...

    Nimm nur mal den relevanten Teil: 'yz'

    if (cText[i] >= 'a' && cText[i] <  'z')
       cText[i]++; // hier wird aus dem 'y' ein 'z' gemacht
    if (cText[i] == 'z')  // hier wird aus dem gerade erzeugten 'z' fälschlicherweise ein 'a' gemacht
        cText[i] = 'a';
    

    Mögliche Lösungen:

    if (cText[i] >= 'a' && cText[i] <=  'z')
       cText[i]++; 
    if (cText[i] == 'z' + 1)
        cText[i] = 'a';
    

    oder:

    int iLength = Edit1->Text.Length();
    char* cText = new char[iLength + 1];
    bool bHandled;
    strcpy(cText, Edit1->Text.c_str());
    for (int i = 0; i < iLength; i++)
    {
        bHandled = false;
        if (cText[i] >= 'a' && cText[i] <  'z') // hier wird gesagt: Wenn der Wert
     //größer oder gleich 'a' und kleiner als 'z' 
        {
            cText[i]++;
            bHandled = true;
        }
        if (cText[i] == 'z' && !bHandled)
            cText[i] = 'a';
    }
    Edit1->Text = AnsiString(cText);
    delete[] cText;
    


  • uluru schrieb:

    @ Joe_M: Ich hab doch geschrieben, dass ich im gegensatz zu anderen nen totaler noob bin.

    Der erste Griff wäre dann also zum Debugger...

    -junix



  • uluru schrieb:

    Vielleicht, weis ja jemand anderes, wie ich das hinbekommen könnte.

    na dann schau dir einfach mal meine lösung an :p



  • Jo Danke an euch alle, hab mir mal das Beispiel von Zwerg23 angeguckt und es hat geklappt, genau so wie ich es mir vorgestellt hab. Die anderen Sachen schaue ich mir bei Gelegenheit auch mal an. 🙂 🙂 🙂 🙂 🙂 🙂

    Hier der Code (zu dem Beispiel alle Buchstaben einen Platz weiter nach rechts zu schieben):

    int feld[256]; 
    for ( int i=0; i < 256; i++) 
      feld[i]=0; 
    feld['a']='b';
    feld['b']='c';
    feld['c']='d';
    feld['d']='e';
    feld['e']='f';
    feld['f']='g';
    feld['g']='h';
    feld['h']='i';
    feld['i']='j';
    feld['j']='k';
    feld['k']='l';
    feld['l']='m';
    feld['m']='n';
    feld['n']='o';
    feld['o']='p';
    feld['p']='q';
    feld['q']='r';
    feld['r']='s';
    feld['s']='t';
    feld['t']='u';
    feld['u']='v';
    feld['v']='w';
    feld['w']='x';
    feld['x']='y';
    feld['y']='z';
    feld['z']='a';
    String Ausgang = Edit1->Text; 
    for ( int i=1;i<=Ausgang.Length(); i++) 
       Ausgang[i]=feld[Ausgang[i]];
    Edit1->Text=Ausgang;
    

    thx auch allen. Ihr seid echt nett. 🙂 🙂 🙂



  • @Joe_M:
    Hi,
    ein einfaches else vor der 2. if hätte nicht gereicht? 😉

    MfG

    Alexander Sulfrian



  • Alexander Sulfrian schrieb:

    ...else vor der 2. if .. 😉

    *schäm*

    Grüße Joe_M.



  • uluru:
    Die Variante mit dem Array ist eher uncool, weil viel zu starr. Sieh dir mal dieses Beispiel an:

    String str = "AbCDE FgHIJ-KLmNo, PQRsT+UVw XYz.";
      int rot = 1; // Verschiebefaktor
    
      for (int i = 1; i <= str.Length(); i++)
      {
        int min, max;
        unsigned char ch = str[i];
        if (isupper(ch))      // Grossbuchstaben
        {
          min = 65;  // 'A'
          max = 90;  // 'Z'
        }
        else if (islower(ch)) // Kleinbuchstaben
        {
          min = 97;  // 'a'
          max = 122; // 'z'
        }
        else
          continue;           // Nicht-Buchstaben überspringen
    
        ch += rot;            // Buchstaben "verschieben"
        if (ch > max)         // Ende des Alphabets beachten
          ch = (min - 1) + (ch - max);
    
        str[i] = ch;
      }
      Caption = str;
    


  • @ jansen: vielleicht ist meine Methode für die die etwas in C++ drauf haben uncool, aber ich finde ich genau richtig für mich, da ich immer einen Überblick habe, welcher Buchstabe mit welchem vertauscht wird.

    Nun habe ich aber ein weiteres Problem mit meinem Code 🙄 .
    Da ich nicht nur eine Zeile, sondern auch einen ganzen Text chiffrieren möchte, hab ich anstatt Edit1 RichEdit1 genommen. Doch leider funktioniert das dann irgendwie nicht mehr, weil da garnichts passiert. Als Warnung erhalte ich im Editor: "Conversion may lose significant digits". 😮 😞 😞 😞
    Kann mir einer sagen was ich machen muss, damit mein Code auch in einem RichEdit funktioniert?
    Ich selber habe das so versucht:
    1. RichEdit1->Text
    2. RichEdit1->Lines->Strings[0] //hier ist es ja nur die erste Zeile, dass weiss ich auch, war nurn verzweifelter Versuch 🙄



  • Hi,
    zeig mal den Code wie du die einzelnen Zeichen ausliest?

    MfG

    Alexander Sulfrian

    EDIT: Ach ich sehe schon....
    Wo kommt denn der Fehler? Welche Zeile?



  • Das ist eigentlich ja kein Fehler, das da Programm ja auch generirt wird und nur nichts tut, wenn ich auf den Button1 drücke. Die Warnung wird einfach so ausgespukt in dieser Zeile:

    Ausgang[i]=feld[Ausgang[i]];



  • Hi,
    das kann ich nicht nachvollziehen...

    Ich hab einfach den Code von dir auf der letzten Seite übernommen und Edit1 durch RichEdit1 ersetzt und es hat geklappt....

    Du solltest vielleicht diesen Code hier:

    for (int i=1; i <= Ausgang.Length(); i++)
      Ausgang[i] = feld[Ausgang[i]];
    

    durch folgendes ersetzten:

    for (int i=1; i <= Ausgang.Length(); i++)
      if (feld[Ausgang[i]] != 0)
        Ausgang[i] = feld[Ausgang[i]];
    

    Dadurch wird immer erst überprüft ob der Char einen Ersatz hat...
    Sonst wird ein Char der nicht im feld mit einem Ersatz definiert ist durch 0 ersetzt werden! Und da ein AnsiString ein Null-terminierter String ist (d.h. bei 0 aufhört) würde der String womöglich etwas kurz werden....

    MfG

    Alexander Sulfrian

    PS: Aber auch hier wäre der Debugger evtl. hilfreich gewesen....



  • @ Alexander Sulfrian:
    Jo danke jetzt funzt das auch mit RichEdit 😃 😃 😃



  • uluru schrieb:

    @ jansen: vielleicht ist meine Methode für die die etwas in C++ drauf haben uncool

    Das hat absolut nichts mit besonderen C++-Kenntnissen zu tun, es geht um's Prinzip. Du solltest dich bemühen, deine Programme generell so zu entwerfen und die Funktionen im Besonderen so zu schreiben, dass sie möglichst flexibel, d.h. für unterschiedliche Fälle einsetzbar sind.



  • Keine Frage, euer Code hat viele Vorteile, nur 2 Dinge haben mich zu meinem Array geführt:
    1. Leicht zu vertehen (was er ja wollte)
    2. Erlaubt auch eine flexible Mischung der einzelnen Buchstaben, eben nicht nur starr um 1, 2 oder auch mehrere Stellen verschoben


Anmelden zum Antworten