2017-01-30 4 views
0

Ich habe eine Caesar-Chiffre codiert, die in den meisten Tests funktioniert, aber in einigen Fällen fehlschlägt. Mehr zu den Testdetails sind https://www.hackerrank.com/challenges/caesar-cipher-1Caesar Cipher Code Fehler

Grundinfo: Die Verschlüsselung verschlüsselt nur Buchstaben, Symbole usw. bleiben unverschlüsselt.

schlägt auf diesen Fall:

90 
!m-rB`-oN!.W`cLAcVbN/CqSoolII!SImji.!w/`Xu`uZa1TWPRq`uRBtok`xPT`lL-zPTc.BSRIhu..-!.!tcl!-U 
62 

dem 90 n (Zeichen im String) ist, zweite Polygonzugs in Array s, und 62 ist k (Menge der Brief Rotationen)

Einsicht in der Fehler meines Codes sehr

geschätzt

-Code wird:

int main(){ 
int n; 
scanf("%d",&n); 
char* s = (char *)malloc(10240 * sizeof(char)); 
scanf("%s",s); 
int k; 
scanf("%d",&k); 

if (k>26) { 
    k%=26; 
} 

int rotation; 
for(int i = 0; i<n; i++) { 
    if (s[i] >= 'a' && s[i] <= 'z') { 
     if((s[i] + k) > 'z') { 
      rotation = (s[i] - 26) + k; 
      s[i] = rotation; 
     } else { 
      s[i] = s[i]+k; 
     } 

    } else if (s[i] >= 'A' && s[i] <= 'Z') { 
     if((s[i] + k) >= 'Z') { 
      rotation = (s[i] - 26) + k; 
      s[i] = rotation; 
     } else { 
      s[i] = s[i]+k; 
     } 
    } 

} 

for(int i=0; i<n; i++) { 
    printf("%c", s[i]); 
} 

return 0; 
} 
+2

* Wie * hat es auf diesem Fall fehlschlagen ? Bitte sei spezifischer. –

+0

Haben Sie auch debugged? Dies ist fast definitiv nur ein einmaliger Indexierungsfehler. – Carcigenicate

+0

Es ist nicht das Problem, aber 'scanf ("% s ", s); ist anfällig für einen Pufferüberlauf. Der beste Weg, um sicherzustellen, dass Sie im Produktionscode niemals etwas Ähnliches machen, ist, sich daran zu gewöhnen, so etwas nie zu tun, selbst bei Spielzeugproblemen. –

Antwort

0

Ok Leute, also habe ich es herausgefunden.

Old Code: 
if((s[i] + k) >= 'Z') 
New Code: 
if((s[i] + k) > 'Z') 

Es vermasselt, wenn ein P (ascii 80) gegeben, sollte es bei Z (ascii 90), sondern hat diese Berechnung beendet haben:

s[i] - 26 + k = 64 
    80 - 26 + 10 = 64 (ascii for @) and thus '@' was returned instead of Z 
Verwandte Themen