Vigenere Cipher Extra Characters

时间:2015-08-26 18:35:03

标签: c encryption vigenere cs50

我将Vigenere Cipher编码为CS50的一部分。这是我的代码。

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

int main(int argc, string argv[])
{
    if(argc != 2)
    {
        printf("Bad Argument!\n");
        return 1;
    }

    for(int k = 0; k <= strlen(argv[1]) - 1; k++)
    {
        if (isalpha(argv[1][k]) == 0)
        {
            printf("Bad Argument!\n");
            return 1;
        }
    }

    string s = GetString();
    char a[strlen(s)];

    int i, j = 0;
    int l = strlen(argv[1]);

    for (i = 0; i < strlen(s); i++)
    {
        int k = (int)(tolower(argv[1][j%l]) - 'a');

        if (s[i] >= 'A' && s[i] <= 'Z')
        {
            a[i] = (s[i] - 'A' + k) % 26 + 'A';
            j++;
        }
        else if (s[i] >= 'a' && s[i] <= 'z')
        {
            a[i] = s[i] - 'a' + k) % 26 + 'a';
            j++;
        }
        else
            a[i] = s[i];
    }

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

}

这是我的pset2 vigenere.c的代码。但是,一旦我编译并运行它,我会在密文的末尾获得misc字符,如:TERMINAL SCREENSHOT

因此,在某些情况下,Check50会接受答案,而在其他情况下,它不会接受答案。

:( encrypts "a" as "a" using "a" as keyword
   \ expected output, but not "a\u001c������\n"
:( encrypts "world, say hello!" as "xoqmd, rby gflkp!" using "baz" as keyword
   \ expected output, but not "xoqmd, rby gflkp!v��\t��\n"
:) encrypts "BaRFoo" as "CaQGon" using "BaZ" as keyword
:) encrypts "BARFOO" as "CAQGON" using "BAZ" as keyword

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您忘记在加密字符串中添加尾随空字节。因此,打印出 1 内存中的字符串(此处为堆栈中的某些数据)之后的所有内容,直到遇到随机空字节为止。

因此,为额外的空字节分配strlen(s) + 1

char a[strlen(s) + 1];

并将a的最后一个元素设置为'\0'

a[strlen(s)] = '\0';

1 表示:如果x位于内存位置0x00跟随内存位置为0x01

注意:

  • 为了表现,我建议引入一个像size_t plainstr_len = strlen(s);这样的变量并在任何地方使用它来代替普通strlen(s)