2016-04-11 87 views
1

基本上我必須創建一個凱撒密碼,它是完全取代每個字母給出的int'k'。這需要2個命令行參數:'./caesar'和'k',由用戶給出。它工作正常;但有一個問題:凱撒密碼重複字母

它加密「BARFOO」爲「EDUIRR」用3關鍵是正確 加密「BaRFoo」爲「FeVJss」使用4作爲正確

關鍵,但它不加密「barfoo」作爲「onesbb」使用65作爲關鍵字,它將其加密爲「oonneess | bb | bb」。

請注意標點符號;帽子等等。

看到問題在這裏?它也爲其他隨機單詞這樣做;它重複字母。幫我......

PS:我對編程非常陌生,因爲你可以在我的代碼中看到,所以請嘗試用英文解釋!

#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

這是什麼:a> - 'a' –

+1

幫我....確定!在您的調試器下運行您的代碼,並逐步處理失敗的案例。 –

+0

你寫了「c = a + k;」如果k是1000,會發生什麼?如果你傳遞了多少個字母?你有%操作員使用它。 – JoulinRouge

回答

2

你可以嘗試採取k%26因爲它應該圍繞字母的字符換行。 這應該可以解決你的問題。

1

你應該嘗試這種方式。以大寫字母的情況。首先從字母'A'獲取索引。 index = a - 'A';

然後在變量k添加值,當與26

modified_index = (index + k) % 26;

現在分開以獲得所需的信只是'A'添加它得到的餘數。

c = 'A' + modified_index;

只有加入k%26不會幫助作爲方式與'z'增量1將變成{這是不對的。另外,如果您只是在k中加上a變量的字母值,那麼它可能會超出ASCII字符的限制,如Joulin所述。