cs50 pset2 caesar---验证密钥

cs50 pset2 caesar---validating the key

我正在学习 cs50,但卡在 pset2 caesar 上。我按照指示一步一步地进行,我通过了关于验证密钥的部分——确保命令行参数只是一个数字 (./caesar 20),如果不是 (./caesar 20x 或./caesar xyz) 打印出来 用法:./caesar key\n。但是,一旦我添加下一行以提示用户输入明文,然后打印回密文,它似乎就不会注册验证密钥的前几行。我知道哈佛的学术诚信政策,所以我更希望 hints/help/explaination 提出这个要求。我在下面发布了我的代码,非常感谢任何帮助。

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;
} 

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

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

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

您必须检查命令行参数中的两件事。 1. 检查你是否有 2 个参数。 (这在您的程序中未选中) 2. 检查它是否不是字母表... 因为第二个参数自动是一个字符串(由于 string argv[]),你必须先将它转换为整数。 ---- 这会产生您必须通过以下方式解决的子问题: 2.A。逐一检查字符串(每个字符),所有字符串都必须是整数。 2.B。如果至少有一个是字符,则 return false...

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

我的回答晚了 2 个月,但由于我刚刚解决了这个问题,我想也许有人可能遇到了我遇到的同样的困难,所以希望有人能读到这篇文章并帮助他们。 :)