cs50 pset2 caesar ---验证密钥

时间:2020-03-18 14:33:05

标签: c cs50

我正在经历CS50,我被卡在pset2凯撒上。我按照说明进行了逐步操作,并且跳过了验证密钥的部分-确保命令行参数只是一个数字(./caesar 20),如果不是(./caesar 20x或./caesar xyz)以打印出用法:./ caesar键\ n。但是,一旦我添加了下几行以提示用户输入纯文本,然后打印出密文,它似乎就没有注册验证密钥的前几行。我知道哈佛大学的学术诚信政策,因此我希望对此提供一些提示/帮助/解释。我已经在下面发布了我的代码,非常感谢您的帮助。

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

        int i = 0;
        if(isalpha(argv[1][i]))
        {
            printf("Usage: ./caesar key\n");
            return 1;
        }
        else
        {
            int key = atoi(argv[1]);
            string text = get_string("plaintext: ");
            printf("ciphertext: ");
            int n = strlen(text);
            for(i = 0; i < n; i++)
            {
                if(isupper(text[i]))
                {
                    printf("%c", (((text[i] - 65) + key) % 26) + 65);
                }
                else if(islower(text[i]))
                {
                    printf("%c", (((text[i] - 97) + key) % 26) + 97);
                }
                else
                {
                    printf("%c", text[i]);
                }
            }
    }
    printf("\n");
    return 0;
} 

2 个答案:

答案 0 :(得分:1)

您需要重新进行输入验证。

  1. 不能确保在命令行中提供一个参数。
  2. 仅验证argv[1]第一个字符。程序应测试参数的每个字符是否为数字(请参见man isdigit)。 isalpha()不是一个很好的测试。如果用户输入$怎么办?

尚不清楚程序何时无法运行,但是基于这些缺陷,这将无法通过check50。

答案 1 :(得分:0)

您必须在命令行参数中检查2件事。 1.检查是否有2个参数。 (未在您的程序中选中) 2.检查它是否不是字母...由于第二个参数自动为字符串(由于字符串argv []),因此必须首先将其转换为整数。 ----这会滋生您必须注意的子问题: 2.A.逐一检查字符串(每个字符),并且所有字符串必须为整数。 2.B.如果至少一个字符是字符,则返回false ...

2.A。和2.B.应该嵌套在一个单独的函数中,该函数将返回一个布尔值(T / F),然后从该布尔值中将这两个布尔表达式括在while循环中。

我的回答迟了两个月,但自从我完成这个问题以来,我认为也许有人可能遇到与我同样的困难,因此希望有人可以阅读并帮助他们。 :)