Пробелы в Цезарь Шифр ​​в С - PullRequest
0 голосов
/ 05 декабря 2018

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

Это работает хорошо, но когда дело доходит до пробелов, все идет не так.

Что должно появиться:

plain text: notverysecure thiscaeserwas

encrypted text: jkpranuoayqna pdeoywaoanswo

Что появляется:

plain text: notverysecure thiscaeserwas

encrypted text: abgirelfrpher guvfpnrfrejnf

Однако, если ввод:

plain text: notverysecurethiscaeserwas

encrypted text: jkpranuoayqnapdeoywaoanswo

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

Мой вопрос состоит в том, чтобы заставить код читать пробелы во входных данных, но не привлекать их к каким-либо манипуляциям

Код:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
//*******************************************************************
// Function to reverse the input string
void rev (const char *const c)
{
if (*c)
{

  rev (c + 1);
  putchar (*c);

 }
}
//*******************************************************************

int main (void)
{
char string[350];
int Key;

printf ("plain text: ");
fgets (string, sizeof (string), stdin);
Key = 256 % (strlen (string) - 1);
//***************************************************************
//ERROR CHECK

if (strlen (string) > 256)
 {
  printf ("[ERR] too many characters\n");
  return -1;
}


for (int counter = 0; string[counter] != '\n'; counter++)
{

  if ( !(islower (string[counter])) && string[counter] != ' ')
{
  printf ("[ERR] invalid characters\n");
  return -2;
}

//**************************************************************

int difference = 0, shift = 0;
for (int counter = 0; string[counter] != '\0'; counter++)
{

  if (string[counter] >= 'a' && string[counter] <= 'z') 
{


  difference = 'z' - string[counter];

  if (Key > difference)
    {
      shift = Key - (difference + 1);
      string[counter] = 'a';
      string[counter] += shift;
    }
  else
    {
      string[counter] += Key;
    }
}
}
printf ("encrypted text: ");

if (Key == 0)
{
      string[strlen(string) - 1] = '\0';
      string[-1] = '\n';
  rev (string);

  return 0;
}
for (int counter = 0; string[counter] != '\0'; counter++)
{
  printf ("%c", string[counter]);
}
}

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Конечно, как вы написали код, key рассчитывается как функция, которая зависит от исходной длины строки (Key = 256 % (strlen (string) - 1);). Об этом говорят две вещи:

  • Цезарь шифр добавляет ключ к каждому зашифрованному символу mod alphabet_size, поэтому, если вы шифруете письма, вы всегда получаете письмо.Это означает, что ключ должен быть в [0..alphabet_size-1] (это не является обязательным требованием, но добавление ключа к символу ввода - это , поэтому будьте осторожны).В вашем случае alphabet_size равно 26, так что лучше:

    Key = some_value_input_from_the_user % alphabet_size;
    
  • Ваш ключ зависит от длины строки исходной входной строки, поэтому, если вы вставляете пробелы, вы меняетедлина строки и так, ключ меняется.Лучше сначала спросить значение ключа или передать его в качестве параметра.Не переусердствуйте.

0 голосов
/ 05 декабря 2018

В этом случае вы должны вручную проверять пробелы при вычислении ключа

int stringLength = 0;

for(int i=0;i<strlen (string);i++){
    if(string[i]!=' '){
        stringLength++;
    }
}

Key = 256 % (stringLength - 1);
...