【问题标题】:cs50 pset2 caesar---validating the keycs50 pset2 caesar---验证密钥
【发布时间】:2020-03-18 14:33:05
【问题描述】:

我正在通过 cs50 并且我被困在 pset2 凯撒上。我按照指示一步一步地进行操作,并且我已经完成了关于验证密钥的部分——确保命令行参数只是一个数字(./caesar 20),如果不是(./caesar 20x 或./caesar xyz) 打印出用法:./caesar key\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;
} 

【问题讨论】:

  • 它只是可读性的东西,但使用像 'a' 这样的字符文字而不是它们的 ASCII 值。
  • printf("Usage: ./caesar key\n"); return 1; 是一种反模式。如果没有错误,你应该return 0。如果出现错误,则应将错误消息写入 stderr。使用语句不是错误消息(无数恼人的程序将 100 行使用语句作为错误消息写入标准错误,然后当用户重新运行带有 | less 附加的程序时,寻呼机会绕过这些程序)。在这种情况下,无效字符是错误,但用法语句是不正确的响应。指定错误,并写入标准错误。
  • 我不确定您的问题是什么,但要调试,请将密码计算分配给一个变量,并在打印之前使用调试器检查该变量。
  • 我假设get_string 获取一个字符串并分配一个它返回的缓冲区?
  • 不要对“65”、“97”和“26”等值进行硬编码。很确定你想要'A''a''z' - 'a' + 1。 (可以说 26 是可以的,但你肯定想要 'a''A' 而不是 97 和 65。

标签: c cs50


【解决方案1】:

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

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

不清楚程序什么时候不工作,但是基于这些缺陷,这不会通过check50。

【讨论】:

    【解决方案2】:

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

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

    我的答案晚了 2 个月,但由于我刚刚完成了这个问题,我想也许有人可能会遇到与我相同的困难,所以希望有人能阅读并帮助他们。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多