C中的Vigenère密码,如何仅在字母字符上移动关键字
Posted
技术标签:
【中文标题】C中的Vigenère密码,如何仅在字母字符上移动关键字【英文标题】:Vigenère cipher in C, how to shift keyword only on alpha chars 【发布时间】:2014-04-04 12:34:47 【问题描述】:我正在尝试为我本周的问题集制作一个 Vigenère 加密代码,我几乎完成了。我有一个小问题,我不能让关键字 char 只在字母字符上移动这是我的代码,我无法跟踪问题。
GetString() 由库实现(类似于 scanf)和字符串 typedef 也
int main(int argc, string argv[])
string keyWord;
if( argc != 2 )
printf("Wrong Argument");
return 1;
else
keyWord = argv[1];
//check if argument is
//only alphabetical characters
for(int i = 0; i < strlen(keyWord); i++)
char c = keyWord[i];
if( !isalpha(c) )
printf("Your Keyword Must Contain Only alphabetical characters\n");
return 1;
string plainText = GetString();
for(int i = 0,j = 0; i < strlen(plainText); i++,j++)
if(j >= strlen(keyWord))
j = 0;
char c = plainText[i];
int keyWordWrapper;
char keyC;
if(isalpha(c))
keyWordWrapper = j % strlen(keyWord);
keyC = keyWord[keyWordWrapper];
int key;
tolower(c);
if(islower(keyC))
key = keyC - 'a';
if(isupper(keyC))
key = keyC - 'A';
c = (c - 'a' + key) % 26 + 'a';
printf("%c",c);
printf("\n");
return 0;
【问题讨论】:
tolower(c);
--> c=tolower(c);
哦,谢谢,我没看到……那么降低后的情况如何维护?我的意思是在prinf中什么是上保持上,什么下保持下,但这不是我的主要问题,这段代码的问题是它没有忽略空间
【参考方案1】:
你可以这样做
//to skip the spaces
if(c==32)
j--;
continue;
char c = plainText[i];
int keyWordWrapper;
char keyC;
if(isalpha(c))
keyWordWrapper = j % strlen(keyWord);
keyC = keyWord[keyWordWrapper];
int key;
tolower(c);
if(islower(keyC))
key = keyC - 'a';
c = (c - 'a' + key) % 26 + 'a';
if(isupper(keyC))
key = keyC - 'A';
c = (c - 'A' + key) % 26 + 'A';
【讨论】:
那么继续做什么?忽略后面的代码进入下一个循环?这是一个错误的答案... 在循环开始后放入if
语句,它不会跳过keyC
并忽略空格,还在新的if
块中添加了j--;
。希望有帮助。以上是关于C中的Vigenère密码,如何仅在字母字符上移动关键字的主要内容,如果未能解决你的问题,请参考以下文章