Search code examples
cif-statementencryptionvigenere

C language-if statement issue


I've created the following program to make a Caesar and Vigenere cipher. I've gotten the Caesar cipher to work correctly, however I cannot get the Vigenere to work properly.

What I want to happen is have my if statements "catch" all the various numbers with an interval of 5. However whenever I run the program my Viegenere cipher outputs the exact same input. I believe this is because I'm making a mistake with my if statements, but i'm not sure what it is.

The beginning of the Viegenere cipher is commented in the code as //Vigenere Cipher-- keyword is "apple"

#include <stdio.h>


int main(){
int i=0;
 //setting the individual slot number for the array-- later used in the while loop
char guy[100];
printf("Enter the plain text:");
fgets(guy,100,stdin); //takes user's input-- such as "abc" and puts it into its respective slot in the array guy[10] r-right?

while (guy[i] != '\0'){ //while loop that runs until it reaches the end of the string


    if ((guy[i]) >= 'A' && (guy[i]<= 'Z')){ //moves capital letter values up 1
        if (guy[i]=='Z'){
            guy[i]=guy[i]-25;
        }
        else {
        guy[i]=guy[i]+1; //makes the current "slot" number go up 1 value. Example: a = 97 + 1 -> b = 98
        }
        }
    if ((guy[i]) >= 'a' && (guy[i]) <= 'z'){// moves lower case letter values up 1
        if (guy[i]=='z'){
            guy[i]=guy[i]-25;
        }
        else{
        guy[i]=guy[i]+1;
        }
    }
    i++; //moves the array's interval up to the next "slot"

}
printf("Encrypted text is: %s\n",guy);

//Vigenere Cipher-- keyword is "apple"
//a = 1  value shift
//p = 16 value shift
//p = 16 value shift
//l = 17 value shift
//e = 5  value shift

printf("Enter the plain text: ");
fgets(guy,100,stdin);//takes user's input

while (guy[i] != '\0'){ //while loop that runs until it reaches the end of the string

    if (i%5==0 || i==0){ //checks to see which character it is in the string, for instance the numbers 0,5,10,15,20 should all be added by 1
    guy[i] = guy[i]+1;
    }

    if ((i-1)%5==0 || i==1){ //all numbers that are second in the key word 'apple', such as 1,6,11,16
        guy[i]=guy[i]+16;
    }
    if ((i-2)%5==0 || i==2){// all numbers that are third to the key word 'apple' , such as 2,7,12,17,22
        guy[i]=guy[i]+16;
    }
    if((i-3)%5==0 || i==3){// all numbers that are fourth to the key word 'apple', such as 3,8,13,18
        guy[i]=guy[i]+17;
    }
    if((i-4)%5==0 || i==4){// all numbers that are fifth in the key word 'apple', such as 4,9,14,19
        guy[i]=guy[i]+5;
    }
    else {
    i++;
    }
    }
printf("Encrypted text is: %s\n",guy);
}

Solution

  • Before encrypting the data again - you should re-initialize the the value of "i" variable

    #include <stdio.h>
    
    
        int main(){
        int i = 0;
        //setting the individual slot number for the array-- later used in the  while loop
        char guy[100];
        printf("Enter the plain text:");
        fgets(guy, 100, stdin); //takes user's input-- such as "abc" and puts it into its respective slot in the array guy[10] r-right?
    
        while (guy[i] != '\0'){ //while loop that runs until it reaches the end of the string
    
    
            if ((guy[i]) >= 'A' && (guy[i] <= 'Z')){ //moves capital letter values up 1
                if (guy[i] == 'Z'){
                    guy[i] = guy[i] - 25;
                }
                else {
                    guy[i] = guy[i] + 1; //makes the current "slot" number go up 1 value. Example: a = 97 + 1 -> b = 98
                }
            }
            if ((guy[i]) >= 'a' && (guy[i]) <= 'z'){// moves lower case letter values up 1
                if (guy[i] == 'z'){
                    guy[i] = guy[i] - 25;
                }
                else{
                    guy[i] = guy[i] + 1;
                }
            }
            i++; //moves the array's interval up to the next "slot"
    
        }
        printf("Encrypted text is: %s\n", guy);
    
        //Vigenere Cipher-- keyword is "apple"
        //a = 1  value shift
        //p = 16 value shift
        //p = 16 value shift
        //l = 17 value shift
        //e = 5  value shift
        printf("The value of i = %d\n", &i);
        i = 0;
        printf("Enter the plain text: ");
        fgets(guy, 100, stdin);//takes user's input
    
        while (guy[i] != '\0'){ //while loop that runs until it reaches the end of the string
    
            if (i % 5 == 0 || i == 0){ //checks to see which character it is in the string, for instance the numbers 0,5,10,15,20 should all be added by 1
                guy[i] = guy[i] + 1;
            }
    
            if ((i - 1) % 5 == 0 || i == 1){ //all numbers that are second in the key word 'apple', such as 1,6,11,16
                guy[i] = guy[i] + 16;
            }
            if ((i - 2) % 5 == 0 || i == 2){// all numbers that are third to the key word 'apple' , such as 2,7,12,17,22
                guy[i] = guy[i] + 16;
            }
            if ((i - 3) % 5 == 0 || i == 3){// all numbers that are fourth to the key word 'apple', such as 3,8,13,18
                guy[i] = guy[i] + 17;
            }
            if ((i - 4) % 5 == 0 || i == 4){// all numbers that are fifth in the key word 'apple', such as 4,9,14,19
                guy[i] = guy[i] + 5;
            }
            else {
                i++;
            }
        }
        printf("Encrypted text is: %s\n", guy);
        getchar();
    }
    

    Output:-

    Enter the plain text:apple Encrypted text is: bqqmf

    The value of i = 1900200 - The value of i before re-initializing.

    Enter the plain text: apple Encrypted text is: bÇÇ}