Vigenere问题集中的非字母问题

时间:2019-02-08 05:14:39

标签: c cs50

我刚刚在CS50中解决了Vigenere问题,但是仍然只有一个错误,非字母字符,当您以纯文本形式编写任何不带空格,逗号,任何非字母字符的东西时,程序将运行良好,但是如果您编写了任何非字母字符,例如空格,则下一个字符将使用错误的键,这是我的代码:

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



int main(int argc, string argv[])
{    



    // Make sure there is a command-line argment
    if (argc != 2)
    {
        printf("Error\n");
        return 1;
    }

    // Variables
    int key[strlen(argv[1])];
    string plaintext;


    // Make sure the comman-line argment is Alphabets then make the key


    for (int i = 0, n = strlen(argv[1]); i < n; i++)
    {

        if (!isalpha(argv[1][i]))
        {
            printf("Error 2\n");
            return 1;
        }

        if (islower(argv[1][i]))
        {
            key[i] = argv[1][i] - 'a';
        }

        else if (isupper(argv[1][i]))
        {
            key[i] = argv[1][i] - 'A';
        }  
    }





    // Ask the user to write the message
    plaintext = get_string("plaintext: ");
    printf("ciphertext: ");



    // Make sure the plaintext doesn't equal NULL
    if (plaintext != NULL)
    {


        for (int i = 0, n = strlen(plaintext); i < n ; i++)
        {

            // Print in slower case
            if (islower(plaintext[i]))
            {
                printf("%c", (((plaintext[i] + key[i % strlen(argv[1])])  - 'a') % 26) + 'a');
            }

            // Print in upper case      
            else if (isupper(plaintext[i]))
            {
                printf("%c", (((plaintext[i] + key[i % strlen(argv[1])])  - 'A') % 26) + 'A');
            }

            // Print the non alphabetic 
            else if (!isalpha(plaintext[i]))
            {
                printf("%c", plaintext[i]);
            }


        }           
        // Print a new line 
        printf("\n"); 
    }
}

1 个答案:

答案 0 :(得分:1)

问题是因为您为此明文和键使用了相同的索引
 for (int i = 0, n = strlen(plaintext); i < n ; i++)循环。每次明文操作时,键都会前进一个位置。显然,这不是您想要的。您需要独立于该循环中的明文索引来管理键索引。

建议您重新观看the walkthrough,并可能像Zamyla所做的熊猫示例一样编写示例。学习如何使用debug50永远不会太早。如果我没记错的话,第二周有一个简短的说法。

CS50x has a stack forum专门讨论关于CS50x和pset的问题。