[英]Vigenere cipher in cs50
我正在通過在線課程教我如何編碼。 我對此很陌生,並且一直在慢慢地通過這門課。 我遇到了 vingenere 密碼的問題。 它不會在整個輸入中迭代鍵。
編輯:鍵應該遍歷用戶輸入,當它到達鍵的末尾時,循環返回並重新開始。 鍵還應跳過任何特殊字符(!@#" "等)
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int main (int argc, string argv[])
{
if(argc !=2)
{
printf("please put in command line argument: example - ./vigenere command\n");
return 1;
}
string key = argv[1];
int keylength = strlen(key);
for (int i=0;i<keylength; i++)
{
if(!isalpha(key[i]))
{
printf("please make sure command is letter only. Please no numbers or special characters!\n");
return 1;
}
}
string input = GetString();
for (int i=0, k=0; i<keylength; i++)
{
if(isalpha(input[i]))
{
if(isupper(input[i]))
{
input[i]=((input[i]-'A')+(key[k%keylength]))%26+'A';
}
else
{
if(islower(input[i]))
{
input[i]=((input[i]-'a')+(key[k%keylength]))%26+'a';
}
}
}
}
printf("%s\n",input);
return 0;
}
我知道字符串不正常,但它包含在標題中以幫助新學生。 我想隨着課程的進行,我們會學到更多。
您沒有在for
循環中更改k
。 事實上,我認為你根本不需要k
。 並且您的循環僅遍歷key
的長度而不是input
的長度。
int inputlength = strlen(input);
for (int i = 0; i < inputlength; ++i) {
if (isupper(input[i]))
input[i] = ((input[i]-'A') + (key[i%keylength])) % 26 + 'A';
/* ... ^ Use i here */
}
關於key為b
,input為A
,必須調整key的問題。
input[i] = ((input[i]-'A') + (key[i%keylength]-'a')) % 26 + 'A';
要跳過輸入特殊字符,
int inputlength = strlen(input);
for (int i = 0, k = 0; i < inputlength; ++i) {
if (isupper(input[i]))
input[i] = ((input[i]-'A') + (key[(k++)%keylength])) % 26 + 'A';
/* ... ^^^ */
else if (islower(input[i]))
input[i] = ((input[i]-'a') + (key[(k++)%keylength])) % 26 + 'a';
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.