gpt4 book ai didi

c - Vigenere 密码 (CS50) — 怎么了?

转载 作者:太空宇宙 更新时间:2023-11-04 02:41:14 26 4
gpt4 key购买 nike

现在已经为此工作了很长一段时间,但似乎没有任何效果。我需要制作一个 Vigenere 密码,它接受一个关键字作为 argy[1] 然后得到一个字符串并使用这两个,做一个 Vigenere 密码所做的事情,其中​​关键字中的字母 A 和 a 对应于 0 的移位并且 z 和 Z 对应于 25 的移位。必须保留大小写(大写和小写),并且不得对字符串中的任何非字母字符进行加密,因此在下一个字母之前不应使用关键字本身中的字母性格在那里。这是基本的破败...

我会发布我的代码。请不要关注问题背后的实际数学(我自己可以弄清楚那部分),而是关注模数和循环的使用。现在我只处理字符串中的字符是否为小写字母。

该程序编译并且似乎可以使用单个字母组合,而使用 argv[1] 的 'b' 和字符串 'a' 输出是 'b'。然而,两个字母关键字产生的加密字母比字符串中的字母更多(我该如何解决这个问题)。另外,当关键字用完所有字母时,我很难让关键字环绕到第一个字母(在字符串中的字母字符比关键字更多的情况下)。

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

int main(int argc, string argv[])
{
int a = argc;

if (a != 2)
{
return 1;
}

string b = argv [1];
int c = strlen(b);
string m;

for (int d = 0; d < c; d++)
{
if ( isdigit(b[d]) || ispunct(b[d]) || isspace(b[d]) )
{
return 1;
}
}

m = GetString();

for (int i = 0, n = strlen(m); i < n; i++)
{
if (islower(m[i]))
{
for (int j = 0; j <= c; j++)
{
if (j > c)
{
j = 1;
printf("%c", ((m[i]+(b[j]))%26)+85);
}
else
{
printf("%c", ((m[i]+(b[j]))%26)+85);
}
}
}
}
}

最佳答案

我认为你的问题出在键的循环上。 Vingenere 密码使用输入键的每个字符来选择一个字母表,该字母表已按该键字符数旋转(即:以该字符开头)。您正在遍历数据,但对于每个数据字符,您还遍历了所有关键字符,您应该只选择下一个字符并将该键视为偏移索引的循环缓冲区。您还需要修复缩进并选择合理的变量名称。我附加了一个工作版本。我没有看到将 const char * 类型定义为 string 的里程数。这不是 C++。

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

int
main(int argc, char *argv[])
{
const char *key = argv[1];
const char *data = argv[2];
int keylen, datalen, keyindex = 0;

if (argc != 3) {
fprintf(stderr, "usage: vig keystring data\n");
return 1;
}

/* validate the key */
keylen = strlen(key);
for (int n = 0; n < keylen; n++)
{
if ( isdigit(key[n]) || ispunct(key[n]) || isspace(key[n]) )
{
fprintf(stderr, "invalid char in key at index %d\n", n);
return 1;
}
}

/* iterate over the data adding a key dependent offset*/
datalen = strlen(data);
for (int i = 0; i < datalen; i++)
{
if (islower(data[i]))
{
printf("%c", ((data[i] + key[keyindex]) % 26) + 85);
/* treat key as circular buffer */
++keyindex;
keyindex %= keylen;
}
}
return 0;
}

测试一下:

C:\Code>vig abc abcd
aced

关于c - Vigenere 密码 (CS50) — 怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31635209/

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