Anfängerfrage: Strings in Zahlen (enum/switch)



  • Hi, ich bin noch ziemlich blutiger Anfänger in C++ und hab bei der Implementierung der Vigenere-Kryptografie folgendes Problem:

    Ich habe sowohl den Key als auch den Klartext als String (als C++ String, nicht als C-String) eingelesen und muss diese ja nun "addieren". Dazu habe ich erstmal versucht, den Buchstaben an i-ter Stelle im Klartext in einer Enumeration

    enum Alphabet {A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z};
      for(int i=0; i<textlength; i++)
      {
       Alphabet TextI=Text[i];
    

    textlength liegt korrekt vor, der String "Text" auch.

    Als das nicht funktionierte, wolölte ich den absoluten Low-Level Weg gehen und über Switch-Blöcke zu "übersetzen".

    switch(Text[i])            
       {
        case A:
         zuueber=1;
         break;
    

    Das klappt leider auch nicht, gibt es eine Möglichkeit, die Buchstaben aus dem String zu holen, so dass ich sie entweder in die enum oder in die Switch-Case Blöcke kriege?

    Danke,
    Dennis



  • enum Alphabet {A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z};
      for(int i=0; i<textlength; i++) {
       Alphabet TextI=Text[i] - 'A';
    
    switch(Text[i]) {
        case 'A':
         zuueber=1;
         break;
    

    Kurt



  • ZuK schrieb:

    enum Alphabet {A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z};
      for(int i=0; i<textlength; i++) {
       Alphabet TextI=Text[i] - 'A';
    

    Das ist allerdings nicht korrekt, Text[i] - 'A' ist nunmal kein Wert vom Typ Alphabet. Ein expliziter Cast hilft allerdings dabei.

    enum Alphabet {A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z};
      for(int i=0; i<textlength; i++)
      {
       Alphabet TextI = static_cast<Alphabet>(Text[i] - 'A');
      }
    

    Dass dies allerdings einiges an Fehlerpotenzial bietet, brauch ich wohl nicht weiter zu erwähnen.



  • [quote="ethone"]

    enum Alphabet {A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z};
      for(int i=0; i<textlength; i++)
      {
       Alphabet TextI=Text[i];
    

    [/cpp]
    das macht mich nicht extrem fröhlich.
    ist das verfahren nicht das, wo du als schlüssel die 26 buchstaben in ner wilden reihenfolge hast und wo du dann um einen buchstaben zu verschlüsseln, (zb beispiel C) den zu einer zahl machst (3, weil an dritter stelle im alphabet) und dann die zahl anhand des keys zum buchstaben (an der 3. stelle im key gucken)?

    wenn ja, denke ich mir eher sowas:

    char key[]="zbcdefghijklmnopqrstuvwxya";//zum testen nur z und a vertauscht
    for(int i=0; i<textlength; ++i){
       char input=text[i];
       int zuueber=input-'a';
       if(zuueber<0 || zuueber>26){
          cout<<'?';
          continue;
       }
       char output='a'+zuueber;
       cout<<output;
    }
    


  • Bei dem Verfahren benutzt du kein wirres Alphabet, sondern ein so oft hintereinandergelegtes Schlüsselwort, wie der Quelltext lang ist. Dann "addierst" du zu dem Ursprungsbuchstaben den Key-Buchstaben plus i. Ich war im erklären noch nie so wirklich top... 😃
    Naja, jedenfalls ist der Grundansatz ja der, dass Buchstaben addiert werden müssen. Dafür wollte ich die enum nehmen, die ich immer noch nicht zum laufen gebracht habe. Ich hab das ganze jetzt über einen Switch hinbekommen, dank an Kurt! Hab ja nur die Hochkommata vergessen.

    int zuueber;
      int zukey;
      int verschlB;
      for(int i=0; i<textlength; i++)
      {
       switch(Text[i])             // "Übersetzung" des Ursprungs-Buchstaben
       {
        case 'A':
         zuueber=0;
         break;
        case 'B':
         zuueber=1;
         break; 
        case 'C':
         zuueber=2;
         break;
    (...)
        case 'Z':
         zuueber=25;
         break;       
        default:
        cout << "Fehler!";       
       }
    

    dann

    switch(key[i])             // "Übersetzung" des Key-Buchstaben
       {
        case 'A':
         zukey=0;
         break;
    (...)
        case 'Z':
         zukey=25;
         break;       
        default:
        cout << "Fehler!";       
       }
       verschlB=zuueber-i+zukey;
       if(verschlB<0)
        {
         verschlB=26+verschlB;
        }
       else
       {
        verschlB=verschlB%26;
       }
    

    und schließlich:

    switch(verschlB)             // "Rückübersetzung" des Key-Buchstaben
       {
        case 0:
         verschl="A";
         break;
    (...)
        case 25:
         verschl="Z";
         break;         
        default:
        cout << "Fehler!";       
       }   
       verschlWort=verschlWort+verschl;
      }
      cout << "VERSCHLUESSELTER TEXT:"<<endl;
      cout << verschlWort << endl;    
    }
    

    Wenn mir noch jemand Tipps zum enum geben kann, her damit. Das müsste doch irgendwie auch gehen, oder?
    Das über die drei Switches zu machen... Naja, es läuft. 🙂
    Danke für die Antworten!



  • Verstehe zwar nicht ganz was du da machst aber

    int zuueber;
      int zukey;
      int verschlB;
      for(int i=0; i<textlength; i++)
      {
       switch(Text[i])             // "Übersetzung" des Ursprungs-Buchstaben
       {
        case 'A':
         zuueber=0;
         break;
        case 'B':
         zuueber=1;
         break;
        case 'C':
         zuueber=2;
         break;
    (...)
        case 'Z':
         zuueber=25;
         break;      
        default:
        cout << "Fehler!";      
       }
    

    Kannst auch einfacher haben

    int zuueber;
      int zukey;
      int verschlB;
      for(int i=0; i<textlength; i++)
      {
         zuueber=Text[i] - 'A';
         if ( zuueber > 25 )
            cout << "Fehler!";      
      }
    

    Kurt



  • Ok, sorry für die blöde Frage, aber wie genau läuft die Zeile ab

    zuueber=Text[i] - 'A';
    

    Könntest du mir da einen link zu einer Erklärung/Tutorial geben? Ich hab das noch nie gesehen. Eingebaut ins Programm funktioniert es zwar, aber dadurch weiß ich nur, dass es die selbe Funktion übernimmt wie mein elendig langer Switch. 🙂 Danke!



  • Sorry mit tutorials kann ich nicht dienen.
    also zb

    int i = Text[i];
    

    der char im Text an der stelle i wird in diesem Fall vom compiler automatisch (implizit) in ein int mit seinem ascii-code umgewandelt.
    Aus 'A' wird alo 65.
    Wenn du nun von 65 wieder den automatisch umgewandelten ascii-wert von 'A' abziehst dann wird daraus 0. aus 'B' wird 1 usw...
    Das ganze funktioniert zufällig weil in der ascii-tabelle die buchstaben A..Z hintereinender liegen.
    Kurt


Anmelden zum Antworten