我将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字符,如:
因此,在某些情况下,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
我做错了什么?
答案 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)