cs50 vigenere-循环错误

时间:2018-11-20 12:17:54

标签: cs50 vigenere

很抱歉,答案很简单。我就是无法解决。

我一直在研究CS50 Vigenere问题,我想我快要完成了。但是,该程序循环的方式出乎我的意料,我不确定为什么。一旦打印了明文的第一个密文字符,它就会循环返回以移至密钥中的下一个字符,但会漏掉需要移至明文的下一个字符的部分。至少我认为这是正在发生的事情。

这是我的代码。任何帮助将不胜感激。

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

int main(int argc, string argv [])
{
    int a;
    int ciphertext;
    int k;
    string plain;
    int cipher;
// check user has input a  valid number of arguments

    if (argc < 2 || argc > 2)
    {
        printf("please input a valid number of arguments\n");

        return 1;
    }
// check user has input a valid key and prompt for plaintext
    char * key = argv [1];


        for (a = 0; a < strlen(key); a++)
        if (!isalpha(key[a]))
        {
            printf("Please input a valid key. Key must be alphabetical");
            return 1;
        }



{
    if (a == strlen(key))
    {
        plain = get_string("Plaintext: ");
    }
{
    printf("ciphertext: ");
}
}


//read plaintext and keep track
{
    for (int i = 0, n = strlen(plain); i < n; i++)
    {
//read key and keep track
        if (isalpha(plain[i]))
        {
            for (int j = 0, p = strlen(key); j < p; j++)



//convert key to numerical

            {
                if (isupper(key[j]) > 'A')
                {
                    k = (key[j] - 65);
//calculate ciphertext and print (upper case)
                    {
                        printf("%c", (plain[i] + (k % p) %26) +65);
                    }
                }

            else if (islower(key[j]) > 'a')
            {
                k = (key[j] - 97);
                {
                    printf("%c", (plain[i] + (k % p) %26) +97);
                }
            }
            else printf("%c", plain[i]);


        }
    }
    }



    {
        printf("\n");
    }

}


}

0 个答案:

没有答案