为什么我的CS50问题集2的凯撒解决方案有时会抛出随机字符

时间:2020-06-04 11:02:51

标签: c cs50

我正在研究CS50上的问题集2,进行凯撒问题并遇到一些麻烦。

我尝试了下面的代码,但是它似乎只为单字符纯文本条目和世界产生随机字符,问好!

请原谅没有评论。

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

//expects function to be declared later
bool validate(string key);
//Command line argument that launches with KEY
int main(int argc, string argv[])
{
//reject all input that is not a single string with the key
    string key = argv[1];
    if (argc != 2)
        {
        printf("Usage: ./caesar key");
        return 1;
        }
    else if (validate(key)==true)
    {
        string plaintext = get_string("plaintext: ");
        char ciphertext[strlen(plaintext)];
        int intkey = atoi(key);

        for(int i = 0; i < strlen(plaintext); i++)
        {
            if ((plaintext[i] >= 65 && plaintext[i] <=90) || (plaintext[i] >=97 && plaintext[i] <=122))
            {
                if ((plaintext[i]+(intkey % 26) > 122) || (plaintext[i]+(intkey % 26) >90 && plaintext[i]+(intkey % 26) < 97))
                {
                    ciphertext[i] = plaintext [i] - (26 - intkey % 26);
                }
                else
                {
                    ciphertext[i] = plaintext[i] + intkey % 26;
                }
            }
            else
            {
                ciphertext[i] = plaintext[i];

            }

        }

        printf("ciphertext: %s\n", ciphertext);
    }
    else
    {
        printf("Usage: ./caesar key");
    }

}

bool validate(string key)
{
    int count = 0;
    for (int i = 0; i < strlen(key); i++)
    {
        if(isdigit(key[i]))
        {
            count++;
        }
    }
    if (count == strlen(key))
    {
        return true;
    }
    else
    {
        return 1;
    }
}

我正在研究CS50上的问题集2,进行凯撒问题并遇到一些麻烦。

我尝试了下面的代码,但是它似乎只为单字符纯文本条目和世界产生随机字符,问好!

请原谅没有评论。

1 个答案:

答案 0 :(得分:1)

ciphertext[]不会以空字符结尾,甚至没有空间,因此printf("ciphertext: %s\n", ciphertext)可能在实际密文之后产生随机字符。可以通过在两次strlen(plaintext)上加1来纠正此问题。