Vigenere遇到密码困难

时间:2015-04-05 18:49:00

标签: c cs50 vigenere

这是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]);
    }            
}

1 个答案:

答案 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)非常重要,因为isalphaisupper仅针对unsigned charEOF的所有值定义。默认情况下,您的平台可能会对char进行签名。

另请注意,putchar(c)printf("%c", c);

效率更高