2012-11-30 74 views
-1

我的目標是製作一個Vigenere密碼。我試圖通過從argv獲取密鑰,從用戶獲取字符串,然後通過消息和密鑰來傳遞消息和密鑰來完成此操作,而這些消息和密鑰是由我製作的組合它們並在打印之前返回新值的。出於某種原因,它只是打印密鑰。我認爲這與新函數有關,以及我如何使用返回的值。下面是代碼:使用函數中的返回值C

#include <stdio.h> 
#include <stdlib.h> 
#include <cs50.h> 
#include <string.h> 
#include <stdbool.h> 
#include <ctype.h> 
int new_crypt; 
int encrypt(string , int); 
int main(int argc, string argv[]) 
{ 
    if(argc != 2) 
    { 
     printf("Plese enter only one key"); 
     return 1; 
    } 

    string message = GetString(); 
    for(int i=0; i < strlen(message); i++) 
    { 
     int klen = strlen(argv[1]); 
     //repeats the key until the message is over 
     int key= argv[1][i%klen]; 
     bool kupper = isupper(key); 
     bool klower = islower(key); 
     bool kalpha = isalpha(key); 
     if(kupper == true){ 
      //ASCII value of A is 65. 'A' = 0 shifts 
      int k = key-65; 
      int new_crypt = encrypt(message, k); 
      printf("%c", new_crypt); 
     } 
     if(klower == true){ 
      //ASCII value of 'a' is 97. 'a' = 0 shifts 
      int k = key- 97; 
      int new_crypt = encrypt(message, k); 
      printf("%c", new_crypt); 
     } 
     if(kalpha == false){ 
      int k = 0; 
      int i = i-1; 
      int new_crypt = encrypt(message, k); 
      printf("%c", new_crypt); 
     } 

    } 

    printf("\n"); 
    return 0; 
} 
int encrypt(string message, int k) 
{ 
    for(int i=0; i < strlen(message); i++) 
    { 
     bool upper = isupper(message[i]); 
     if(upper == true) 
     { //Makes sure the message doesnt go past 'Z'.. If it does it mod 90 it           /     // and adds 65 ('A') 
      int crypt = (message[i]+ k) % 90; 
      if(crypt < 65) 
      { 
       int new_crypt = (crypt + 65); 
       return new_crypt; 
      } 
      else{ 
       int new_crypt = crypt; 
       return new_crypt; 
      } 
     } 
     bool lower = islower(message[i]); 
     if(lower == true) 
     { 
      int crypt = (message[i]+ k) % 123; 
      if(crypt < 97) 
      { 
       int new_crypt = crypt + 97; 
       return new_crypt; 
      } 
      else{ 
       int new_crypt = crypt; 
       return new_crypt; 
      } 
     } 
     bool alpha = isalpha(message[i]); 
     if(alpha == false) 
     { 
      int new_crypt = message[i]; 
      return new_crypt; 
     } 
    } 
    return 0; 
} 
+7

「串」是什麼? – melpomene

+0

我仍然在消化'encrypt()'for循環中兩個if-else-block的完整性。我會在一瞬間得到'string'... – WhozCraig

+2

發佈真正的代碼,包括。 – Lundin

回答

1

encrypt功能的迴路是完全無用的,因爲通過循環體沒有return聲明引起循環中沒有路徑將被終止,並控制返回到encrypt呼叫者。這使得程序作爲一個整體重複使用來自密鑰的連續元素加密消息的第一個字符。

解決這個問題的最簡單方法是做如下修改

  • encrypt功能
  • 通行證取出環,作爲一個額外的參數,從要對消息進行加密的元素,使得簽名

    int encrypt(string message, int k, int i) 
    

一些其他備註:

  • 全局變量new_crypt沒有任何地方使用。你可以安全地刪除它。 (您應儘可能避免使用全局變量)。
  • 除了使用幻數65,您還可以使用字符文字'A'。這具有以下優點:即使最終不使用ASCII,也不需要註釋來解釋數字65,並且它始終是大寫字母A的正確值。 (但也請參閱下一個項目符號)
  • 您的代碼假設字母A到Z(和a到z)具有連續的值(例如Z == A + 26)。這可能是ASCII編碼中英文字母的情況,但不保證其他語言字母或編碼。
+0

謝謝!我甚至不知道我可以將'int i'傳遞給另一個函數,但是現在你提到了它,它是完美的。對不起,我的無知,只有我的第二個星期。 感謝您的評論,我現在就做出改變。 – Corvertbibby