2016-04-11 10 views
1

Grundsätzlich muss ich eine Caesar-Chiffre erstellen, die nur jeden Buchstaben mit einem Buchstaben ersetzt, der int 'k' entfernt ist. Dies erfordert 2 Befehlszeilenargumente: './caesar' und 'k', die vom Benutzer angegeben werden. es funktioniert gut; hat aber ein Problem:Caesar Cipher wiederholt Buchstaben

es „BARFOO“ als „EDUIRR“ mit 3 als Schlüssel verschlüsselt, die korrekt ist „BaRFoo“ als „FeVJss“ verschlüsselt 4 als Schlüssel verwendet, die korrekt ist

aber nicht verschlüsseln "barfoo" als "onesbb" mit 65 als Schlüssel verschlüsselt es als "oonneess | bb | bb".

Bitte beachten Sie die Interpunktion; die Kappen und so weiter.

Sehen Sie das Problem hier? es tut dies auch für andere zufällige Wörter; es wiederholt Buchstaben. Hilf mir ....

PS: Ich bin extrem neu in der Programmierung, wie Sie in meinem Code sehen können, bitte versuchen Sie es auf Englisch zu erklären!

#include <stdio.h> 
#include <cs50.h> 
#include <string.h> 
#include <stdlib.h> 
int main(int argc, string argv[]) 
{ 
string s; 
//int d; 
int c; 
int a; 
if(argc != 2) 
{ 
    printf("Please run with a command line argument."); 
    return 1; 
} 
else 
{ 
    s = GetString(); 
} 
int k = atoi(argv[1]); 

for(int i = 0; i < strlen(s); i++) 
    { 
     a = s[i]; 
     if(a<'A'||a>'z') 
     { 
      printf(" "); 
     } 
     else 
     { 
      if(a>='A'&&a<='Z') 
      { 
       c = a+k; 
       while(c>'Z') 
       { 
        c = 'A'+(c-'Z')-1; 
        printf("%c", c); 
       } 

       if(c<='Z') 
       { 
        printf("%c", c); 
       } 
      } 
      else if(a>-'a'&&a<='z') 
      { 
       c = a+k; 
       while(c>'z') 
       { 
        c = 'a'+(c-'z')-1; 
        printf("%c", c); 
       } 
       if(c<='z') 
       { 
        printf("%c", c); 
       } 
      } 
     } 
    } 
printf("\n"); 
} 
+2

Was ist das: a> - 'a' –

+1

Hilf mir .... sicher! Führen Sie Ihren Code unter Ihrem Debugger aus und gehen Sie durch den fehlgeschlagenen Fall. –

+0

Sie haben geschrieben "c = a + k;" Was passiert, wenn k 1000 ist? Wenn Sie die Anzahl der Buchstaben übergeben? Sie haben den Operator% verwendet. – JoulinRouge

Antwort

2

können Sie versuchen, k%26 zu nehmen, da es um die Buchstaben des Alphabets wickeln sollte. Das sollte dein Problem lösen.

1

Sie sollten diesen Weg versuchen. Nehmen Sie den Fall von Großbuchstaben. Holen Sie zuerst den Index von dem Buchstaben "A". index = a - 'A';

dann den Wert in der Variablen k hinzufügen und den Rest erhalten, wenn geteilt mit 26.

modified_index = (index + k) % 26;

nun der gewünschte Buchstabe fügen Sie ihn mit 'A' nur zu bekommen.

c = 'A' + modified_index;

Nur k%26 Zugabe wird nicht helfen, wie diese Weise 'z' mit Schrittweite 1 wird in { gedreht werden, die falsch ist.

Wenn Sie nur Wert in k mit dem Buchstaben, der durch die Variable a gekennzeichnet ist, kann es überschreiten die Grenze der ASCII-Zeichen, wie Joulin erwähnt.