卡在 Vigenere 加密程序的最后部分
Got stuck in the final part of a program for encryption in Vigenere
我正在参加 Edx 上的在线课程 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[]
结束后访问 keyword[j]
是错误的。 (未定义的行为)。当密钥比消息的字母部分短时,OP 的代码会发生这种情况。
只需根据需要重新使用 keyword[]
字符串即可。提示:重置 j
.
将鼠标悬停在上面进行回答。
int j_length = strlen(关键字);
...
j++;
如果 (j >= j_length) j = 0;
我正在参加 Edx 上的在线课程 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[]
结束后访问 keyword[j]
是错误的。 (未定义的行为)。当密钥比消息的字母部分短时,OP 的代码会发生这种情况。
只需根据需要重新使用 keyword[]
字符串即可。提示:重置 j
.
将鼠标悬停在上面进行回答。
int j_length = strlen(关键字);
...
j++;
如果 (j >= j_length) j = 0;