2017-01-30 2 views
0

J'ai codé un algorithme de chiffrement César qui semblent travailler dans la plupart des tests, mais échoue sur quelques cas. Plus sur les détails du test sont https://www.hackerrank.com/challenges/caesar-cipher-1Caesar Cipher Code de Flaw

Informations de base: Le chiffrement crypte uniquement les lettres, les symboles, etc restent non cryptés.

échoue sur ce cas:

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

Où 90 est N (caractères dans la chaîne), deuxième ligne est une chaîne en série s et 62 est k (nombre de rotations de lettres)

Toute idée dans le défaut de mon code sera très apprécié

code:

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

* Comment * t-il échouer sur ce cas ? S'il vous plaît soyez plus précis. –

+0

Aussi, avez-vous débogué? C'est presque certainement juste une erreur d'indexation "one off". – Carcigenicate

+0

Ce n'est pas le problème, mais 'scanf ("% s ", s);' est vulnérable à un buffer-overflow. La meilleure façon de s'assurer que vous ne faites jamais quelque chose comme ça dans le code de production est de prendre l'habitude de ne jamais faire quelque chose comme ça, même dans les problèmes de jouets. –

Répondre

0

Ok les gars, donc je l'ai compris.

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

Il foiré quand donné un P (ascii 80), il aurait dû arrêter à Z (ascii 90) mais a fait ce calcul:

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