Почему мой код пропускает пробелы и знаки препинания при перемещении букв через шифр Цезаря? - PullRequest
0 голосов
/ 02 августа 2020

Итак, мой код для моего программирования Цезаря прекрасно меняет буквы с помощью клавиши, но не сохраняет пробелы или знаки препинания. Например, если пользователь запускает программу, используя ./caesar 2 в командной строке, и ему нужно «A b.» для смещения результат будет «Cd», но должен быть «C d.». Я пытался решить эту проблему, но не знаю, как это сделать. Любая помощь будет оценена. Мой код ниже.

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

int main(int argc, string argv[])
{

   string plain = NULL;
   char num1;
   char halftotal;
   char total;
   
   //creating the key

   if(argc == 2)
   {
       int shift = atoi(argv[1]);
       if(shift < 0)
         {
            printf("Usage: ./caesar key\n");

            return 1;
         }
         else if(shift > 0)
         {
            //prompting for plaintext

       plain = get_string("Plaintext: ");

       //enciphering plaintext

       int test = strlen(plain);
      printf ("Ciphertext: ");
       for( int i = 0;i < test;i++)
         {
           if(isalpha(plain[i]))
               {
                  if(isupper(plain[i]))
                  {
                      num1 =  plain[i] - 65;
                      halftotal = (num1 + shift)%26;
                      total = (halftotal + 65);\
                      printf("%c", total);
                  }
                  else if(islower(plain[i]))
                  {
                      num1 =  plain[i] - 97;
                      halftotal = (num1 + shift)%26;
                      total = (halftotal + 97);
                      printf("%c", total);
                  }

               }
         }
         printf("\n");

         return 0;
         }

   }
   else if(argc != 2)
   {
      printf("Usage: ./caesar key\n");
   }

}

Ответы [ 3 ]

1 голос
/ 02 августа 2020

Ваш l oop в основном выглядит так:

   for( int i = 0;i < test;i++)
     {
       if(isalpha(plain[i]))
           {
               // convert the character
               ...
           }
     }

Итак, когда символ - это буква, вы выполняете преобразование. Но если это не так, вы ничего не делаете. Вот почему вы не видите в выводе ничего, кроме букв.

Вам нужно добавить здесь предложение else, чтобы просто распечатать все, что было дано, если это не буква.

   for( int i = 0;i < test;i++)
     {
       if(isalpha(plain[i]))
           {
               // convert the character
               ...
           }
       else
       {
           printf("%c", plain[i]);
       }
     }
0 голосов
/ 02 августа 2020

Тест if(isalpha(plain[i])) больше ничего не делает, если символ не является алфавитным, поэтому он игнорируется.

Вы можете удалить это и добавить else printf("%c", plain[i]); ниже, чтобы часть кода выглядела как это

printf ("Ciphertext: ");
for( int i = 0;i < test;i++) 
{
    if(isupper(plain[i]))
    {
        num1 =  plain[i] - 'A';         // replaced magic numbers too       
        halftotal = (num1 + shift) % 26;
        total = (halftotal + 'A');
        printf("%c", total);
    }
    else if(islower(plain[i]))
    {
        num1 =  plain[i] - 'a';
        halftotal = (num1 + shift) % 26;
        total = (halftotal + 'a');
        printf("%c", total);
    }
    else 
    {
        printf("%c", plain[i]);
    }
}
printf("\n");
0 голосов
/ 02 августа 2020

isalpha исключает пробелы и знаки препинания.

http://cplusplus.com/reference/cctype/isalpha/

...