这是cs50的Vigenere cypher。这是我第一次编码,现在我已经解决了一个星期了,而且我似乎无法在循环结束后第一次打印第一个字母。
例如:
jharvard@appliance (~/Dropbox): ./viginere abcde You're key is abcde Type your text: aaaaa aaaaaa aaaaaaa aaaaaaaa abcde bcde bcdebc debcde
首先打印a
,然后从b
开始,最后它不打印每个字母。密钥由用户选择。
我不知道我做错了什么。
for (int i = 0, j = strlen(plain_text), l = 0; i < j; i++)
{
int rotation_1 = (tolower(plain_text[i]) + (key[l] - 97)) % 122;
int rotation_2 = (plain_text[i] + (key[l] - 97)) % 122;
//if it is a letter
if (isalpha(plain_text[i]))
{
l = l % strlen(key);
//if the it is uppercase
if (isupper(plain_text[i]))
{
printf("%c", toupper(rotation_1));
}
//else if it is lowercase
else
{
printf("%c", rotation_2);
}
l++;
}
// if it is not a letter we print it as it is
else
{
printf("%c", plain_text[i]);
}
}
答案 0 :(得分:2)
这是一个更简单的版本,修复了逻辑:
for (int i = 0, n = strlen(plain_text), k = 0, klen = strlen(key); i < n; i++) {
int c = (unsigned char)plain_text[i];
//if it is a letter
if (isalpha(c)) {
if (isupper(c)) {
c = 'A' + (c - 'A' + key[k] - 'a') % 26;
} else {
c = 'a' + (c - 'a' + key[k] - 'a') % 26;
}
k = (k + 1) % klen;
}
putchar(c);
}
将plain_text[i]
转换为(unsigned char)
非常重要,因为isalpha
和isupper
仅针对unsigned char
和EOF
的所有值定义。默认情况下,您的平台可能会对char
进行签名。
另请注意,putchar(c)
比printf("%c", c);