CS50 Vigenere字符不移动

时间:2019-02-05 00:34:48

标签: cs50

我不知道我是否已经看了太长时间了,但是我的角色保持不变,即如果我的密钥是'b'并以明文形式输入'hello',它仍然为我提供了'你好'。我似乎无法弄清楚我要正确调整字母(即我已将字母0-25编入索引)的缺失之处

非常感谢您提供任何帮助。

enter code here
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int shift(char c);

int main(int argc, string argv[])
{
    // Ensure the program has only one command-line
    if (argc != 2)
    {
        printf("Usage: ./vigenere key\n");
        return 1;
    }
    else
    { 
     // Ensure user only enter key in alphabet
     string s = (argv[1]);

    //Make sure command line argument is alpha
    for (int i = 0; i < strlen(s); i++)
    {
        if (isalpha(s[i]) == false)
        {
            printf("Usage: ./vigenere key\n");
            return 1;
        }
    }
        // Converting string to integers
        int key = atoi(argv[1]);

        // Prompt user input in plaintext
        string plaintext = get_string("plaintext: ");
        printf("ciphertext: ");

        for (int i = 0; i < strlen(plaintext); i++)
        {
            // Encrypt and preserve lower case characters
            if islower(plaintext[i])
            {
                // Position of the character in the alphabet
                int alphaPos = plaintext[i] + key - 97; 
                // Keep the number within the alphabet loop
                int wrappedChar = alphaPos % 26;
                printf("%c", wrappedChar + 97);
            }
            else if isupper(plaintext[i])
            {
                int alphaPos = plaintext[i] + key - 65;
                int wrappedChar = alphaPos % 26;
                printf("%c", wrappedChar + 65);
            }
            else 
            {
                printf("%c", plaintext[i]);
            }
        }
        printf("\n");
    }   
    return 0;
}

int shift(char c)
{
    //TODO
    // If isUpper then minus 65
    if (isupper(c))
    {
        return c - 65;
    }

    // If isLower then minus 97
    else if (islower(c))
    {
        return c - 97;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

这个int key = atoi(argv[1]);(可能)是问题的根源。看来它是凯撒运动留下的。 atoi不会检测到错误,因此如果您发送b作为参数,key将等于0,因为b无法转换为int,并且hellohello

建议您再次回顾一下演练,尤其是Zamyla的熊猫示例。