gpt4 book ai didi

c - Vigenere 密码额外字符

转载 作者:太空宇宙 更新时间:2023-11-04 01:57:28 25 4
gpt4 key购买 nike

我正在编写 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 代码。但是,一旦我编译并运行它,我就会在密文末尾得到杂项字符,例如: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

我做错了什么?

最佳答案

您忘记了 NUL 终止符。

C 没有作为“字符串” 的内置类型,而您的 CS50 讲师通过在“cs50.h”中为“字符串”创建类型定义来损害您的利益。在 C 语言中,“字符串” 是一个字符数组,末尾有一个 NUL 终止符。数组的大小必须是字符串长度加一。

所以你代码中的第一个错误是

char a[strlen(s)];

应该是

size_t length = strlen(s);
char a[length+1];

您的代码的轻微优化将替换

for (i = 0; i < strlen(s); i++)

for (i = 0; i < length; i++)

但是代码中最大的问题是缺少 NUL 终止符,您可以通过在循环结束后添加以下行来解决这个问题

a[length] = '\0';

如果你真的想学习 C,我建议你转到另一所大学。理解 C 中的字符串是编写稳定、可靠、安全代码的关键。而且因为您的教授对您隐瞒了细节,所以您什么也学不到。

关于c - Vigenere 密码额外字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32234188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com