【问题标题】:CS50 Caesar cypher disrupts after checking command-line argumentCS50 Caesar cypher 在检查命令行参数后中断
【发布时间】:2021-03-08 21:16:19
【问题描述】:

我一直在用 Caesar 的密码编写代码(通过将字母移动一个输入的数字来对字母进行编码)。它一直正常工作,直到我引入了一个条件,确保输入的密钥是一个数字并且以某种方式破坏了代码的工作。

我不明白这种情况与之后的代码有何关联以及出了什么问题。

有人可以帮忙吗?

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

int main(int argc, string argv[])

{
    if (argc != 2)
    {
        printf("Usage: ./caesar key\n");
        return 1;
    }

    for (int j = 0; j < strlen(argv[1]); j++)
    {
        if (!(isdigit(argv[1][j])))
        {
            printf("Usage: ./caesar key\n");
            return 1;
        }

    }


    int k = atoi(argv[1]);
    if (argc == 2 && k > 0)

    {
        string s = get_string("plaintext: ");

        int m = k % 26;

        //introducing an array type char of string length size
        char cypher[strlen(s)];


        for (int i = 0; i < strlen(s);  i++)
        {
            //checking if it's a letter, if yes then next if
            if (isalpha(s[i]))
            {
                //checking if it's uppercase
                if (isupper(s[i]))
                {
                    cypher[i] = (s[i] + m);
                    //make a round if it's beyond Z
                    if (cypher[i] > 'Z')
                    {
                        cypher[i] = cypher[i] - 26;
                    }

                }
                // checking if it's lowercase
                else if (islower(s[i]))
                {
                    //if it falls beyond ascii table
                    if ((s[i] + m) > 126)
                    {
                        cypher[i] = (s[i] - 26 + m );
                    }
                    else
                    {
                        cypher[i] = (s[i] + m);
                    }
                    //make a round if it's beyond z
                    if (cypher[i] > 'z')
                    {
                        cypher[i] = cypher[i] - 26;
                    }
                }

            }
            // if it's not a letter - keep the initial character, write it in the cypher
            else
            {
                cypher[i] = s[i];
            }
        }

        printf("ciphertext: %s\n", cypher);
        return 0;

    }



}

【问题讨论】:

  • 以某种方式破坏了代码。请告诉我们您观察到的错误或不正确行为。
  • 如果您将for (int j = 0; j &lt; strlen(argv[1]); j++) { if (!(isdigit(argv[1][j]))) { printf("Usage: ./caesar key\n"); return 1; } } 部分注释掉,则完全正确。但是当我添加它时,它会产生完全错误的密码。
  • char cypher[strlen(s)]; 你不是 NUL 终止数组。这意味着它不是有效的 C 字符串。如果修复仍然不起作用,请提供准确的输入、预期结果和实际结果。
  • @kaylum 对不起,没明白你的意思。我声明大小等于大小字符串 s 的 char 数组 - 您作为输入获得的那个数组
  • C 中的字符串需要以 '\0' (NUL) 字符结尾。所以数组大小需要再增加一个:char cypher[strlen(s)+1]; 然后在printf 之前你需要cypher[i]='\0';

标签: c command-line-arguments cs50 caesar-cipher


【解决方案1】:

C 中的 strlen 不考虑空字符 数组的长度应该是[strlen(s)+1]并且应该加上\0字符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2022-09-27
    • 2016-04-15
    • 1970-01-01
    • 2016-05-31
    • 2012-10-21
    • 1970-01-01
    相关资源
    最近更新 更多