-1

这是用于 cs50 的 Vigenere 密码。这是我第一次编码,我现在要绕这个一周了,我似乎无法在循环第一次完成后打印第一个字母。

例如:

jharvard@appliance (~/Dropbox): ./viginere abcde
你是关键是 abcde
输入您的文字:
啊啊啊啊啊啊啊啊啊啊
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]);
    }            
}
4

1 回答 1

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 char定义EOFchar可能会默认为您的平台签名。

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

于 2015-04-05T19:20:24.850 回答