我的“Vigenere CS 50”项目效果不佳

时间:2017-03-22 11:00:03

标签: c cs50 vigenere

我目前正在研究Vigenere CS 50问题。代码似乎工作得很好,但有时输出会被输出字符串末尾添加的其他符号混淆。例如,当我使用“a”键加密“a”时,输出有时只能作为“a”,有时可能看起来像“a<”或“aR”或“a {7”......

同时,代码可以使用更长的密钥和更复杂的纯文本,所以我现在真的很困惑,并且真的不知道从什么开始。

你能看一下代码吗?

提前致谢, 弗拉基米尔

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

int main(int argc, string argv[])
{
    if (argc != 2)
    {
    printf("Usage: ./vigenere k\n");
    return 1;
    } 

    string k = (argv[1]);

    int key[strlen(k)];

    int n = strlen(k);

    for (int i = 0; i < n; i++)
    {
        if (isalpha(k[i]))
        {
            if (isupper(k[i]))
            {
                key[i] = (int)k[i] - 65;
            }
            else
            {
                key[i] = (int)k[i] - 97;
            }
        }
        else 
        {
            printf("Key must be alphabetical\n");
            return 1;
        }
    }

    string p;

    do 
    {
        printf("plaintext: ");
        p = get_string();
    } while (p == NULL); 

    char c[strlen(p)];

    int cn = 0;

    for (int j = 0, m = strlen(p); j < m; j++)
    {
        if (isalpha(p[j]))
        {
            if (isupper(p[j])) 
            {
                c[j] = (((int)p[j] + key[cn] - 65) % 26 + 65);
            }
            else
            {
                c[j] = (((int)p[j] + key[cn] - 97) % 26 + 97);
            }

            cn++;
            cn = cn % n;
        }
        else 
        {
            c[j] = p[j];
        }
    }

    printf("ciphertext: %s", c);
    printf("\n");

    return 0;

}

1 个答案:

答案 0 :(得分:3)

这是一个很好的老式&#34;不是空终止&#34;串。 C样式字符串(您使用char c[strlen(p)];创建的字符串)没有与之关联的长度。为了计算它们的长度,标准库假设它们将以\0(空字节)终止。你没有这样做,所以当你printf时,它会继续打印,直到找到它。

你需要:

  1. 为空字节分配足够的空间:char c[strlen(p) + 1];
  2. 把它放在最后:c[strlen(p)] = 0;