所以这就是我为CS50Vigenère问题提供的解决方案。我对编程还很陌生,大概只有几个星期,所以我很抱歉我的代码形式。

这里的问题是输出不是我期望的那样。

例子:

./vigenere ABC

输入:你好

输出:hfnLp

./vigenere ABC

输入:你好

输出:HFN,P

./vigenere培根

输入:上午十一点在公园与我见面

输出:Neg zF av uf pCx bT gzrwEP OZ

(应该是“ Negh zf av huf pcfx bt gzrwep oz”)

我一无所知,因为它似乎工作了一点,但是有些不对劲。

我检查了几乎每一个我正在使用的整数,它们都按照我的预期工作。

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

int main (int argc, string argv[])
{
    string k = argv[1]; //key
    string p; //plaintext
    int j = 0; //the counter for key index
    int ci; // the variable for reaching the right shifting value on both uppercase and lowercase letters
    int K;//the value of the key index shift

    if (argc != 2)
    {
        printf("input error\n");
    }
    else
    {
       p = get_string();

       for (int i = 0, n = strlen(p); i < n; i++)
       {
           if (isupper(k[j]))
           {
            ci = 65;
           }
           else
           {
            ci = 97;
           }

           K = k[j % strlen(k)] - ci;

           if (isalpha (p[i]))
           {
                printf("%c", p[i] + K);
                j++;
           }
           else
           {
            printf("%c", p[i]);
           }
       }
       printf("\n");
    }
}

最佳答案

strlen(k)迭代之后,isupper(k[j])使用超出k末尾的索引。

您可以更改:

if (isupper(k[j]))
{
 ci = 65;
}
else
{
 ci = 97;
}

K = k[j % strlen(k)] - ci;


至:

K = toupper(k[j % strlen(k)]) - 'A';


(请注意,这依赖于C标准不能保证的属性,即字母的字符代码是连续的并且按字母顺序排列。)

09-11 03:31