What worked for caesar doesn't seem to work for vigenere. Everything else apparently checks out, but the first letter keeps shifting every time I run the program, and I can't figure out why. Could someone give me a hint?

What I've found out so far:

- moving the pointer with "pk=(pk+1)%(keylen+1)" instead of "pk=(pk+1)%keylen" makes the other letters in the cyphertext output wrong results as well.

- I can't see a pattern to the shifts. I ran the program 26 times, and the first letter of the cyphertect shifted as follows: mxmaqqaiqjjpwltvxk_aa[xplm

So it's going into non-alpha characters, as well.

<code>
    string ptxt= get_string("plaintext: ");
    //assign the length of the second argument to the int keylen
    int keylen=strlen(argv[1]);
    //assign the length of ptxt to the integer txtlen
    int txtlen=strlen(ptxt);

    //initiallize the int pk
    int pk=0;
    //initialize the string ky to hold the converted key
    char ky[keylen+1];

    //copy each character in the string argv[1] to ky and convert it to lower case
    for(pk=0;pk&lt;keylen;pk++)
    {
        char ori=argv[1][pk];
         ky[pk]=tolower(ori);
    }

    //print "ciphertext: " before the cipher
    printf("ciphertext: ");

    //for each position in ptxt
    for (int pos=0; pos<txtlen; pos++)
        {
            //if the position pos contains a letter
            if(isalpha(ptxt[pos]))
            {

                //if the letter is lower case
                 if(islower(ptxt[pos]))
                {
                    //assign the ascii value of that letter to the integer letl
                    int letl=ptxt[pos];
                    //Convert letl's value to the corresponding position in the lowercase alphabetical index, add k, make sure the value stays within the alphabet, and convert back to the ascii value.
                    //assign the result to the int c
                    int c=(((letl-'a')+(ky[pk]-'a')) % 26)+'a';
                    //print the character corresponding to the resulting number on the ascii table
                    printf("%c",tolower(c));
                    //move the key pointer
                    pk=(pk+1)%keylen;
                }
                //if the letter is upper case
                else if(isupper(ptxt[pos]))
                {
                     //assign the ascii value of that letter to the integer letl
                    int letu=ptxt[pos];
                    //Convert letl's value to the corresponding position in the lowercase alphabetical index, add k, make sure the value stays within the allphabet, and convert back to the ascii value.
                    //assign the result to the int cu
                    int cu=(((letu-'A')+(ky[pk]-'a')) % 26)+'A';
                    //print the character corresponding to the resulting number on the ascii table
                    printf("%c",toupper(cu));
                    //move the key pointer
                    pk=(pk+1)%keylen;
                }
            }
            //if the position pos does not contain a letter
            else
            {

                //print out the contents "as is" in the plain text
                printf("%c",ptxt[pos]);
            }

    }
    }
            //print a new line
            printf("\n");
    //return code 0 and end the program
    return 0;
}
</code>