2017-01-16 9 views
-3

Я могу получить его для печати открытого текста и смещения по значению ключа, но Я немного смущен тем, как заставить письма обернуться и как реализовать его в моем код.Получение Caesar Cipher для обертывания

Любые предложения будут оценены.

спасибо.

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

//Gets number of user arguments and the key. 
int main (int argc, string argv[]) { 
    if(argc != 2) { 
     printf("try again\n"); 
    } 
    //Converts string to int. 
    int key = atoi(argv[1]); 

    //Will store the chars + key. 
    int result; 

    printf("Please enter what you would like to encrypt: "); 

    //Gets plaintext from user. 
    string plainText = get_string();  

    //Iterates over the user's input, checking for the case of each char. 
    for (int i = 0; i <= strlen(plainText); i++) { 
     if (toupper(plainText[i]) || tolower(plainText[i])) { 
        result = plainText[i]; 
     } 
    //Checks if i'th char is a letter and shifts it. 
     if (isalpha(plainText[i])) { 
        result = plainText[i + key]; 
     } 
    } 
    printf("%c", result); 
} 
+0

Возможный дубликат [Домашнее задание (ревизия): шифр Цезаря, обернуть вокруг, когда char>> z (C++)] (http://stackoverflow.com/questions/8489474/homeworkrevision-caesar-cipher-wrap-around-when- chars-are-zc) – Ari0nhh

+2

Что это должно делать: 'if (toupper (plainText [i]) || tolower (plainText [i]))'? –

ответ

1

Один из самых опрятных уловок, чтобы сделать это, чтобы использовать оператор по модулю %.

Теперь говорим о вашем коде,

for (int i = 0; i <= strlen(plainText); i++) { 
if (toupper(plainText[i]) || tolower(plainText[i])) { 
      result = plainText[i]; 
} 
//Checks if i'th char is a letter and shifts it. 
if (isalpha(plainText[i])) { 
      result = plainText[i + key]; 
    } 
} 
printf("%c", result); 

Этот код не имеет смысла для меня. Ваш первый если условие я думаю, чтобы отличить от не алфавитных символов, поэтому если состояние может быть что-то вроде if (! isalpha(plainText[i]),

Тогда ваше второе условие, чтобы добавить ключ к персонажу, если это алфавит. Это должно быть что-то вроде

if (isalpha (plainText[i])) { 
    if (islower(plainText[i]) 
     result = ((plainText[i] - 'a') + key) % 26 + 'a'; 
    else 
     result = ((plainText[i] - 'A') + key) % 26 + 'A'; 

} 

Объяснение выше логики:: Сначала проверить погоду буква в нижнем регистре или в верхнем регистре, так что вы можете сделать это в диапазоне от 0 до 26, Затем добавьте ключ с модулем ключа, чтобы он мог вернуться назад к 0, тогда вы снова преобразуете его в ascii, добавив значение «a».

например. если plainText[i] = 'x' (ascii value 120) и key = 5, то

plainText[i] = 120 
plaintext[i] - 'a' = 23 
(plaintext[i] - 'a') + key = 28 // Out of 0-25 alphabet range 
((plaintext[i] - 'a') + key) % 26 = 2 // Looped back 
(((plaintext[i] - 'a') + key) % 26) + 'a' = 99 (ascii value for 'c') 

Так как вы можете видеть, что мы получили c после добавления 5 к x

И, наконец, положение вашей печати должно быть внутри цикла, в противном случае он собирается печатать только последний вход , что неверно.

Надеюсь, я сделал все, чтобы помочь вам, имея в виду Кодекс чести CS50. А также я хотел бы предложить вам задать эти вопросы в своих форумах, потому что они являются более knoledgeble сообщества использовать <cs50.h>

Кроме того, пользуется CS50, это один из лучших курсов CS, чтобы вы начали;)

+0

Большое вам спасибо за помощь. –

+0

Лучше использовать символьные константы вместо целых констант: 'result = ((plainText [i] - 'A') + key)% 26 + 'A';'. Это делает смысл более понятным. –

+0

@ Давид, спасибо за ваш совет, я обновил ответ. –

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

  • Нет связанных вопросов^_^