2014-02-09 45 views
-1

密碼適用於islower部分,但不是isupper部分。例如,如果我給3的密鑰並輸入I like pie!!加密,我得到O olnh slh!!我也試過HELLO並得到NKRRU。 isupper部分也是返回標點符號而不僅僅是字母。我還沒有弄清楚爲什麼原始消息正在被改變以匹配密碼消息。C中的凱撒密碼工作於低於而不是較高

#include <stdio.h> 
#include <cs50.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 

int main (int argc, string argv[]) 
{ 
    /* 
    Get key from user at command line 
    Get plaintext from user 
    Use key to encipher text: c[i] = (p[i] + k)%26 
    Print ciphered message 
    */   
    string message, cipher; 
    int key; 

    // command line, if user doesn't enter 2 arguments return 1 and request a valid 
    //encryption key and rerun. 
    if (argc != 2) 
     { 
     printf("Please enter a valid encryption key and rerun program.\n"); 
     return 1; 
     } 
    else 
     { 
     key = atoi(argv[1]); 
     } 


    printf("Enter the message you wish to encrypt.\n"); 
    message = GetString(); 
    cipher = message; 
    int length = strlen(message); 

    for (int i = 0; i < length; i++) 
     { 
     if (isalpha(message[i])) 
      { 
      if (isupper(message[i])) 
       { 
       cipher[i] = (message[i] - 'A' + key) % 26 + 'A'; 
       } 
      else (islower(message[i])); 
       { 
       cipher[i] = (message[i] - 'a' + key) % 26 + 'a'; 
       } 
      } 
     else continue; //message[i] contains punctuation or a space 
     } 
     printf("Your original message was..\n"); 
     printf("%s\n", message); 
     printf("The encrypted message is...\n"); 
     printf("%s\n", cipher);   
     return 0;    
} 

回答

3

錯字和丟失if per @ interjay。

變化

else (islower(message[i])); 

//       v 
else if (islower(message[i])) 
// or simply 
else // Since `message[]` is an alpha, but not upper 

與錯誤,當文本是大寫,既cipher[i] = (message[i] - 'A' ...cipher[i] = (message[i] - 'a' ...發生。給定cipher = message,密碼應用兩次。


@keshlam指出關於丟失的緩衝區是一個重要的問題。但我不知道string是什麼類型。這是某種C++ lite字符串嗎?如果是char *,代碼可以使用cipher = strdup(message);

cipher = malloc(length + 1); 
if (cipher === NULL) Handle_OutOfMemeory(); 
cipher[length] = '\0'; 
for (int i = 0; i < length; i++) 
    ... 
+0

您還需要在那裏添加一個'if'。 – interjay

+0

我假設字符串typedef'd爲'char *'。不是很好的做法,但我對許多課程感到不滿意,正如我們在這裏得到的問題所暗示的。 – keshlam

+0

@keshlam我懷疑你是對的。 – chux

2

因爲你說 密碼=消息你重寫消息;這意味着兩者現在都指向同一塊內存。分配一個新的輸出緩衝區。

並指出Chux發現多餘的分號。