我的 Vigenere Cypher CS50 有什么问题

What's wrong with my Vigenere Cypher CS50

我的 CS50 pset2 Vigenere 密码代码如下。请帮我找出错误。当键包含字母 'a' 时,这段代码基本上什么都不做。它说 "Floating Point Exception"。我不知道那是什么意思。请检查代码并告诉我错误是什么。

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

int main(int argc, string argv[])
{
    //check if there are only two command line arguments//

    if (argc!=2)
    {
        printf("Please enter a valid input!\n");
        return 1;
    };

    string key = argv[1];

    for(int i=0, n=strlen(key); i < n; i++)
    {
        //check if there is any number in the key//

        if(!isalpha(key[i]))
        {
            printf("Invalid Key!\n");
            return 1;
        };

        //converting the key into ints.//

        if(islower(key[i]))
        {
            key[i] = key[i] - 'a';
        }
        else if(isupper(key[i]))
        {
            key[i] = key[i] - 'A';
        };
    };

    //prompt user for the string//

    string s = GetString();

    int c;
    int k;
    int stln = strlen(s);
    int kyln = strlen(key);          

    for(int j = 0, m = strlen(s); j < m; j++)
    {
        if(islower(s[j]))
        {
            s[j] = s[j] - 'a';

            //for wrapping around the key//

            if(stln > kyln)
            {
                k = j % strlen(key);
                c = (s[j] + key[k]) % 26;
                s[j] = 'a' + c;
            } 
            else
            {
                c = (s[j] + key[j]) % 26;
                s[j] = 'a' + c;
            };
         } 
         else if (isupper(s[j]))
         {
             s[j] = s[j] - 'A';

             //for wrapping around the key//

             k = j % strlen(key);

             if(stln > kyln)
             {
                 c = (s[j] + key[k]) % 26;
                 s[j] = 'A' + c;
             } 
             else
             {
                 c = (s[j] + key[j]) % 26;
                 s[j] = 'A' + c;
             };
         };

    };

    printf("%s\n", s);

};

strlen(key) 在后面的代码中无效,因为每当使用 'a''A' 时,前面的代码都会在 key[] 中注入空字符:

if(islower(key[i])) {
  key[i] = key[i] - 'a';

在更改其内容之前找到 key[] 的字符串长度并使用它

 int n = strlen(key);
 ...
 // k = j % strlen(key);
 k = j % n;