维吉尼亚密码。代码输出
Vigenere Cipher. Code output
我一直在研究 cs50 pset2,在研究了几天之后,我以为我已经掌握了 vigenere 密码。此代码旨在采用用户提供的字母参数 (argv[]),并将其用作密钥以按字母索引中的数字加密用户提供的短语 (string)。例如,如果你给出参数 'abc' 和字符串 'cat' 那么输出应该是 'cbv'(a moving 0, b moving 1, c moving 2) 参数也应该环绕这样如果字符串更长,参数将换行到它的第一个字符并继续直到字符串结束。
这是我的代码:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[])
{
if(argc != 2)
{
printf("Try again\n");
return 1;
}
string k = (argv[1]);
int klen = strlen(k);
for(int x = 0; x < klen; x++)
{
if(isalpha(k[x]))
{
if(isupper(k[x]))
{
k[x] = tolower(k[x]);
}
k[x] -= 'a';
}
else
{
printf("Try again\n");
return 1;
}
}
string code = GetString();
int clen = strlen(code);
for(int a = 0, b = 0; a < clen; a++)
{
if(isalpha(code[a]))
{
int key = k[b%klen];
if(isupper(code[a]))
{
printf("%c", (((code[a] - 'A') + key)%26) + 'A');
b++;
}
else
{
printf("%c", (((code[a] - 'a') + key)%26) + 'a');
b++;
}
}
else
{
printf("%c", code[a]);
}
}
printf("\n");
}
代码似乎适用于密钥 +1 的长度。
例如,
我输入了一个参数 'aaaa'
然后输入一串'bbbbb'
并正确接收 'bbbbb'。
但是,如果我输入相同的 'aaaa'
然后输入比key+1长的字符串'bbbbbbb'
我收到 'bbbbbNN'
我认为我的操作顺序有问题,但尝试移动括号无济于事。我希望有人能指出正确的方向,说明为什么我的密钥没有正确包装。
像这样的代码最大的风险是所有相似的、重复的子句。一个错误很难跟踪完成。在处理代码的同时对密钥进行任何处理都是低效的。
这里有一个返工,在处理代码之前完全处理密钥,并尝试将处理过程减少到一种情况。看看它是否更适合您:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
if (argc != 2)
{
fprintf(stderr, "Try again\n");
return EXIT_FAILURE;
}
string key = strdup(argv[1]);
size_t key_length = strlen(key);
for (int x = 0; x < key_length; x++)
{
if (isalpha(key[x]))
{
if (isupper(key[x]))
{
key[x] = tolower(key[x]);
}
key[x] -= 'a';
}
else
{
fprintf(stderr, "Try again\n");
return EXIT_FAILURE;
}
}
string code = GetString();
int code_length = strlen(code);
for (int a = 0, b = 0; a < code_length; a++)
{
if (isalpha(code[a]))
{
int start = isupper(code[a]) ? 'A' : 'a';
printf("%c", (((code[a] - start) + key[b++ % key_length]) % 26) + start);
}
else
{
printf("%c", code[a]);
}
}
printf("\n");
free(key);
return EXIT_SUCCESS;
}
我一直在研究 cs50 pset2,在研究了几天之后,我以为我已经掌握了 vigenere 密码。此代码旨在采用用户提供的字母参数 (argv[]),并将其用作密钥以按字母索引中的数字加密用户提供的短语 (string)。例如,如果你给出参数 'abc' 和字符串 'cat' 那么输出应该是 'cbv'(a moving 0, b moving 1, c moving 2) 参数也应该环绕这样如果字符串更长,参数将换行到它的第一个字符并继续直到字符串结束。
这是我的代码:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[])
{
if(argc != 2)
{
printf("Try again\n");
return 1;
}
string k = (argv[1]);
int klen = strlen(k);
for(int x = 0; x < klen; x++)
{
if(isalpha(k[x]))
{
if(isupper(k[x]))
{
k[x] = tolower(k[x]);
}
k[x] -= 'a';
}
else
{
printf("Try again\n");
return 1;
}
}
string code = GetString();
int clen = strlen(code);
for(int a = 0, b = 0; a < clen; a++)
{
if(isalpha(code[a]))
{
int key = k[b%klen];
if(isupper(code[a]))
{
printf("%c", (((code[a] - 'A') + key)%26) + 'A');
b++;
}
else
{
printf("%c", (((code[a] - 'a') + key)%26) + 'a');
b++;
}
}
else
{
printf("%c", code[a]);
}
}
printf("\n");
}
代码似乎适用于密钥 +1 的长度。 例如, 我输入了一个参数 'aaaa'
然后输入一串'bbbbb' 并正确接收 'bbbbb'。
但是,如果我输入相同的 'aaaa'
然后输入比key+1长的字符串'bbbbbbb' 我收到 'bbbbbNN'
我认为我的操作顺序有问题,但尝试移动括号无济于事。我希望有人能指出正确的方向,说明为什么我的密钥没有正确包装。
像这样的代码最大的风险是所有相似的、重复的子句。一个错误很难跟踪完成。在处理代码的同时对密钥进行任何处理都是低效的。
这里有一个返工,在处理代码之前完全处理密钥,并尝试将处理过程减少到一种情况。看看它是否更适合您:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
if (argc != 2)
{
fprintf(stderr, "Try again\n");
return EXIT_FAILURE;
}
string key = strdup(argv[1]);
size_t key_length = strlen(key);
for (int x = 0; x < key_length; x++)
{
if (isalpha(key[x]))
{
if (isupper(key[x]))
{
key[x] = tolower(key[x]);
}
key[x] -= 'a';
}
else
{
fprintf(stderr, "Try again\n");
return EXIT_FAILURE;
}
}
string code = GetString();
int code_length = strlen(code);
for (int a = 0, b = 0; a < code_length; a++)
{
if (isalpha(code[a]))
{
int start = isupper(code[a]) ? 'A' : 'a';
printf("%c", (((code[a] - start) + key[b++ % key_length]) % 26) + start);
}
else
{
printf("%c", code[a]);
}
}
printf("\n");
free(key);
return EXIT_SUCCESS;
}