CS50 Pset2。的V @ genere。上部文本降低键,反之亦然问题

时间:2016-04-07 12:24:01

标签: c vigenere cs50

好。所以,我需要制作一个Vigenere密码。当文本和键都是小写的大写时,代码编译正常。但是当文本和密钥与大小写不同时,代码不起作用。然后它不会打印任何东西。例如,当密钥是:aaAA。文字是aBcD。结果是:aD。有人可以给我一个提示吗? :)

#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

int main (int argc, string argv[])
{
    string key = argv [1]; //argv [1] is the key. 0 is compile program
{    
    if (argc != 2)
    {
        printf ("Please give one key: "); //if there are more or less then 2 argc, then have to try again
    }

for (int j = 0, n = strlen (key); j < n; j++)
    if (!isalpha (key [j]))      
    {
        printf ("Please give a key in alphabetic characters: ");
        //key must be alphabetic. For loop to check every character of the key. 
        return 1;
    }
}

string text = GetString(); //Get secret message from user

int j = 0;
for (int i = 0, n = strlen (text); i < n; i++)
{
    if (isupper (text [i]))
    {
        if (isupper (key [j]))
        {
        /*Minus 65 to make count till 26 from text and key. Use modulo to wrap around key. And modulo to wrap around alphabet.
        Plus 65 to go to correct ASCII character. */
        int u = ((((text [i] - 65) + (key [j % strlen (key)] - 65)) % 26) + 65);
        printf ("%c", u);
        }
    }
    else if (islower (text [i]))
     {
        if (islower (key[j]))
        {
        int l = ((((text [i] - 97) + (key [j % strlen (key)] - 97)) % 26) + 97);
        printf ("%c", l);
        }
    }
    else if (islower (text [i]))
    {  
        if (isupper (key[j]))
        {
        int lu = ((((text [i] - 97) + (key [j % strlen (key)] - 65)) % 26) + 97);
        printf ("%c", lu);
        }
    }
    else if (isupper (text [i]))
    {
        if (islower (key[j]))
        {
        int ul = ((((text [i] - 65 + (key [j % strlen (key)] - 97)) % 26) + 65);
        printf ("%c", ul);
        }
    }
    else
        {
        // When character is non alphabetic print it in its original form.
        printf ("%c", text [i]);
        }
    j++; 
}
{
    printf ("\n");
    return 0;
}
}

1 个答案:

答案 0 :(得分:1)

问题在于你的if,else-if,else-if ...语句。原因是原因if isupper(text[i])返回true,if isupper(key[j])返回false,它永远不会评估else if语句。你应该这样做

if( isupper(text[i])){
    if(isupper(key[j])){ // Both upper
       //do stuff
    }
    else if(islower(key[j])){ //Here key is lower and text is upper
       //do stuff
    }
}
else if (islower(text[i])){
    if (islower(key[j])){ //Both lower
        //do stuff
    }
    else if(isupper(key[j])){ //Key upper and text lower
        //do stuff
    }
}
else{//It's not alpha
    //do stuff
}

/***************NEW********************/
j = j%strlen(key); //I suggest using this at the end of the loop to avoid key[j] to go out of it's bounds
// j = (j==strlen(key)) ? 0 : j; //Another alternative

另外,如果角色不是alpha,我认为你不应该增加j