2016-04-17 2 views
0

Я создал две вещи для pset2 шифровального шифрования и дешифратора цезаря. Мой шифр работает, и он называется caesar.c, но мой decryptor (decryptor.c) не работает, и я не могу понять, почему? Вот мой код.Мой дешифратор не работает

Caesar.c

#include <cs50.h> 
#include <string.h> 
#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include "encryptorFunction.c" 


int main(int argc, string argv[]) { 
    //checks for enough args 
    if (argc >= 2) { 
     //converts the second arg to an integer 
     int k = atoi(argv[1]); 
     string stringToBeEncrypted = GetString(); 
     printf("%s\n", encryptor(stringToBeEncrypted, k)); 
    } else { 
     printf("Please add a key argument\n"); 
     return 1; 
    } 
} 

Decryptor.c

#include <cs50.h> 
    #include <string.h> 
    #include <stdio.h> 
    #include <math.h> 
    #include <stdlib.h> 
    #include <ctype.h> 
    #include "encryptorFunction.c" 

    // almost same as caesar 


    int main(void) { 
     const string stringToBeEncrypted = GetString(); 
      // string stringToBeEncrypted = GetString(); 
      //checks all possible decryptions 
      for(int k=1;k<26;k++) { 
       printf("%s\n", encryptor(stringToBeEncrypted, k)); 
      } 
    } 

encryptorFunction.c

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

string encryptor(string encryptString, int key) { 
    //loops through every character 
    string encryptStringCopy = encryptString; 
    for (int i = 0, n = strlen(encryptStringCopy); i < n; i++) { 
     //converts the specific char to its ascii value 
     int ascii = (int) encryptStringCopy[i]; 
     //makes key 31 is the same as key 5 
     key = key % 26; 
     //checks if it is an alphabetical letter 
     if (isalpha(encryptStringCopy[i])) { 
      //checks if lowercase 
      if (islower(encryptStringCopy[i])) { 
       //handles the corner case of being z since 26 % 26 is not 26 it's 0 
       if ((ascii-96+key) == 26) { 
        ascii = 122; 
       }else { 
        //takes the lowercase alphabetical numbers to the 1-26 alphabet then checks mod 26 to cycle back and adds it back. 
        ascii = ((ascii-96+key) % 26) + 96; 
       } 
       //else part is for uppercase case 
      }else { 
       //same logic as above 
       if ((ascii-64+key) == 26) { 
        ascii = 90; 

       }else { 
        ascii = ((ascii-64+key) % 26) + 64; 
       } 
      } 
     } 
     //converts the ascii back to a char 
     char newChar = (char) ascii; 
     //sets the new char into the string 
     encryptStringCopy[i] = newChar; 
    } 
    return encryptStringCopy; 
} 
+0

Вы действительно намерены файл кода 'Decryptor.c', чтобы вызвать функцию' шифратор() ', то той же функции, которая называется в 'Caesar.c'? –

+0

Да, так оно расшифровывается. –

+0

Вы видите, что с этим не так? –

ответ

2

Ваша encryptor() функция изменяет входной строки (аргумент encryptString) на месте. В результате неоднократные вызовы на одном и том же входе будут иметь неожиданные результаты.

Эта функция должна создать новую строку, чтобы вернуться, а не модифицируя один он был принят в.

+0

Я заметил это, и я действительно решил исправить это, но он не работал. –

+0

Не могли бы вы привести пример? Я попытался сделать это, но это не сработало. –

+0

Так что вы пробовали, и что случилось? «не работал» примерно такой же расплывчатый, как вы можете быть. – duskwuff

Смежные вопросы