2017-01-30 184 views
0

我已經編碼了一個凱撒密碼,似乎在大多數測試中工作,但在少數情況下失敗。更多測試細節https://www.hackerrank.com/challenges/caesar-cipher-1凱撒密碼漏洞

基本信息:該密碼只有加密字母,符號等留加密。

失敗在此情況下:

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

其中90爲n(在字符串中的字符),第二行是字符串數組S,和62爲k(信旋轉量)

任何瞭解進入我的代碼的漏洞將得到高度讚賞

代碼:

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

*如何*它失敗在這種情況下:

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

給出P(ASCII 80),它應該在Z(ASCII 90)已經停止時,而是做這個計算它搞砸了?請更具體一些。 –

+0

另外,你有調試嗎?這幾乎肯定只是一個「一次性」的索引錯誤。 – Carcigenicate

+0

這不是問題,但'scanf(「%s」,s);'容易發生緩衝區溢出。確保你從不在生產代碼中這樣做的最好方法就是養成從不這樣做的習慣,即使在玩具問題上也是如此。 –

回答

0

好傢伙,所以我已經知道了。

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