gpt4 book ai didi

c - 陷入 Vigenere 加密程序的最后部分

转载 作者:行者123 更新时间:2023-11-30 19:38:20 25 4
gpt4 key购买 nike

我正在参加 Edx 上的在线类(class) cs50,我有一个作业,其中我必须创建一个程序,用户在其中输入关键字(然后用于加密)和需要在 Vigenere 中加密的字符串。密码。

Vigenere 的工作原理是对关键字后的文本进行加密:例如,如果我的字符串是“Hello”,关键字是“abc”:a 等于字母字符中的 0,b 为 1,c 为 2;因此字符串中的字母 h 被加密,无需切换字符(关键字中的 s 字母 a 为 = 0),字母 e 被切换一位,并加密为f,依此类推。如果关键字的长度小于字符串的长度(如本例),加密必须再次使用关键字的第一个字符,这是我的问题。

事实上,我认为我整个程序实现得很好,但我不确定如何考虑关键字的字符数少于输入的字符串。该程序现在仅返回加密字符串的第一个字符,第一个字符未加密,然后停止。
我不要求完整的解决方案,但我只是想了解如何解决我的程序问题。

这是我的程序:

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

int vigenere_low( char c )
{
int v = c - 'a';
return v;
}

int vigenere_up( char c )
{
int v = c - 'A';
return v;
}

int keyword_low( char c )
{
int k = c - 'a';
return k;
}

int keyword_up( char c )
{
int k = c - 'A';
return k;
}


int main( int argc, string argv[] )
{
string p;
string keyword = argv[1];

if ( argc != 2 )
{
printf("Usage: ./vigenere keyword\n");
return 1;
}

for ( int i = 0, n = strlen(keyword); i < n; i++ )
{
if ( !isalpha( keyword[i]) )
{
printf("Usage: ./vigenere keyword(alphabetical) \n");
return 1;
}
}

p = GetString();
int j = 0;


for ( int i = 0, n = strlen( p ); i < n; i++ )
{

if ( isalpha( p[i]) )
{


if ( islower( p[i]) )
{
if ( islower( keyword[j]) )
{
int a = (( vigenere_low( p[i]) + keyword_low( keyword[j]) ) % 26 ) + 'a';
printf("%c", a);
j++;
}
else
{
int a = (( vigenere_low( p[i]) + keyword_up( keyword[j]) ) % 26 ) + 'a';
printf("%c", a);;
j++;
}

}
if ( isupper( p[i]) )
{
if ( islower( keyword[j]) )
{
int a = (( vigenere_up( p[i]) + keyword_low( keyword[j]) ) % 26 ) + 'A';
printf("%c", a);
j++;
}
else
{
int a = (( vigenere_up( p[i]) + keyword_up( keyword[j]) ) % 26 ) + 'A';
printf("%c", a);
j++;
}

}
else
{
printf("%c", p[i] );
}



}

return 0;
}
}

最佳答案

... not sure how to take into consideration if a keyword has less characters than the string entered.

访问keyword[j]超出 keyword[] 的末尾不好。 (未定义的行为)。当 key 短于消息的 alpha 部分时,OP 的代码就会发生这种情况。

只需重复使用 keyword[]根据需要字符串。提示:重置j .

将鼠标悬停在上面即可获取答案。

int j_length = strlen(关键字);
...
j++;
如果 (j >= j_length) j = 0;

关于c - 陷入 Vigenere 加密程序的最后部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38331667/

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