c - Vigenere Cipher



我在运行下面为vigenere cipher设计的代码时遇到了这个问题。即使经过彻底的调试,我也无法调试这个问题。它显示了错误:被服务器杀死。请提供帮助。

 /**
 * 
 * vigenere.c
 * 
 * Abhishek kumar
 * encrypts entered string using vigenere cipher
 * */
 #include <stdio.h>
 #include <stdlib.h>
 #include <cs50.h>
 #include <ctype.h>
 #include <string.h>
 int main(int argc, string argv[] )
 {
    if (argc != 2)
    {
        printf("Usage: /home/cs50/pset2/vigenere <keyword>");
        return 1;
    }
    if (argc == 2)
    {   string key = argv[1];
        for(int k = 0,l = strlen(key);k < l; k++)
        {
            if(!isalpha(key[k]))
            {
                printf("Keyword must only contain letters A-Z and a-z");
                exit(1);
            } 
        }

        string txt = GetString();
        int i = 0,j = 0,c = 0;
        int n = strlen(txt);
        int m = strlen(key);
        while(i < n)
        {
            if (isupper(txt[i]))
            {
                if(isupper(key[j]))
                {
                    c = ((((int) txt[i] - 65 + (int) key[j] -65)%26) + 65);
                    printf("%c", (char) c);
                    i++;
                    j++;
                }
                if(islower(key[j]))
                {
                    c = ((((int) txt[i] - 65 + (int) key[j] -97)%26) + 65);
                    printf("%c", (char) c);
                    i++;
                    j++;
                }
            }
            else if (islower(txt[i]))
            {
                if(isupper(key[j]))
                {
                    c = ((((int) txt[i] - 97 + (int) key[j] -65)%26) + 97);
                    printf("%c", (char) c);
                    i++;
                }
                if(islower(key[j]))
                {
                    c = ((((int) txt[i] - 97 + (int) key[j] -97)%26) + 97);
                    printf("%c", (char) c);
                    j++;
                }

            }
            else
            {
                printf("%c",txt[i]);
                i++;
            }
            if (j == m-1)
            {
                j = 0;
            }
        }


    }
 }

以下是它失败的一些测试用例。

:) vigenere.c exists
:) vigenere.c compiles
:( encrypts "a" as "a" using "a" as keyword
    killed by server
:( encrypts "world, say hello!" as "xoqmd, rby gflkp!" using "baz" as keyword
    killed by server
:( encrypts "BaRFoo" as "CaQGon" using "BaZ" as keyword
    expected output, but not "CGSFpp"
:( encrypts "BARFOO" as "CAQGON" using "BAZ" as keyword
    expected output, but not "CASFPO"
:) handles lack of argv[1]
:) handles argc > 2
:) rejects "Hax0r2" as keyword

islower(txt[i])部分中,在所有情况下都无法递增ij。在不递增i的地方,即键的第一个字符和文本都是小写的地方,您最终会得到一个无限循环。

isupper(txt[i])部分中,在isupper(key[j])部分中递增ij,然后输入islower(key[j])部分,因为使用的是if而不是else if

对于以上两者,将if(islower(key[j]))更改为else if(islower(key[j])),并在每个内部if块之后移动j++printf。至于i,将while更改为for,并将i作为其一部分递增。

当检查是否应该重置j时,您将关闭1。m-1key的有效索引,所以您还不想重置。在j == m时执行。

此外,将ASCII代码替换为它们所代表的实际字符,这样可以更清楚地了解您在做什么。演员阵容也不需要。

    for (i=0; i < n; i++)
    {
        if (isupper(txt[i]))
        {
            if(isupper(key[j]))
            {
                c = (((txt[i] - 'A' + key[j] -'A')%26) + 'A');
            } 
            else if(islower(key[j]))
            {
                c = (((txt[i] - 'A' + key[j] -'a')%26) + 'A');
            }
            printf("%c", c);
            j++;
        }
        else if (islower(txt[i]))
        {
            if(isupper(key[j]))
            {
                c = (((txt[i] - 'a' + key[j] -'A')%26) + 'a');
            } 
            else if(islower(key[j]))
            {
                c = (((txt[i] - 'a' + key[j] -'a')%26) + 'a');
            }
            printf("%c", c);
            j++;
        }
        else
        {
            printf("%c",txt[i]);
        }
        if (j == m)
        {
            j = 0;
        }
    }

最新更新