Ankith
Ankith

Reputation: 15

Why is my code skipping over spaces and punctuation when shifting letters through the caesar cipher?

So my code for my caesar programming is shifting the letters with the key just fine, but it is not keeping the spaces or puncuation. For example, if the user runs the program using ./caesar 2 in the command line, and they want "A b." to be shifted, the result comes out as "Cd", but it should be "C d.". I have tried to fix the problem but I just don't know how. Any help would be appreciated. My code is below.

#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");
   }

}

Upvotes: 0

Views: 88

Answers (3)

Weather Vane
Weather Vane

Reputation: 34575

The test if(isalpha(plain[i])) doesn't do anything else if the character is not alphabetical, so it is ignored.

You can remove that and add else printf("%c", plain[i]); below so that part of the code looks like this

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");

Upvotes: 0

Sebi2020
Sebi2020

Reputation: 2159

isalpha exludes whitespace and punctuation characters.

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

Upvotes: 0

dbush
dbush

Reputation: 224377

Your loop basically looks like this:

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

So when the character is a letter you do a conversion. But if it's not, you do nothing. That's why you don't see anything other than letters in the output.

You need to add an else clause here to simply print whatever was given if it's not a letter.

   for( int i = 0;i < test;i++)
     {
       if(isalpha(plain[i]))
           {
               // convert the character
               ...
           }
       else
       {
           printf("%c", plain[i]);
       }
     }

Upvotes: 1

Related Questions