CS50-pset2-替换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CS50-pset2-替换相关的知识,希望对你有一定的参考价值。

我看不到我的pset2替换代码丢失了。当我使用check50测试程序时,它将返回以下结果:

:) replacement.c存在

:) replacement.c编译

:(使用ZYXWVUTSRQPONMLKJIHGFEDCBA作为密钥将“ A”加密为“ Z”预期的“密文:Z ...”,而不是“密文:Z ...”

:(使用ZYXWVUTSRQPONMLKJIHGFEDCBA作为密钥将“ a”加密为“ z”预期的“密文:z ...”,而不是“密文:z ...”

:(使用NJQSUYBRXMOPFTHZVAWCGILKED作为密钥,将“ ABC”加密为“ NJQ”预期的“密文:NJ ...”,而不是“密文:NJ ...”]

:(使用NJQSUYBRXMOPFTHZVAWCGILKED作为密钥将“ XyZ”加密为“ KeD”预期的“密文:Ke ...”,而不是“密文:Ke ...”]

:(使用YUKFRNLBAVMWZTEOGXHCIPJSQD作为密钥,将“ This is CS50”加密为“ Cbah ah KH50”预期的“密文:Cb ...”,而不是“密文:Cb ...”

:(使用yukfrnlbavmwzteogxhcipjsqd作为密钥将“ This is CS50”加密为“ Cbah ah KH50”预期的“密文:Cb ...”,而不是“密文:Cb ...”

:(使用YUKFRNLBAVMWZteogxhcipjsqd作为密钥将“ This is CS50”加密为“ Cbah ah KH50”预期的“密文:Cb ...”,而不是“密文:Cb ...”

:(使用DWUSXNPQKEGCZFJBTLYROHIAVM作为密钥加密所有字母字符预期的“密文:Rq ...”,而不是“密文:Rq ...”]

:)处理缺少密钥的问题>

:)处理无效的密钥长度

:)处理密钥中的无效字符

:)处理密钥中的重复字符

:)处理密钥中的多个重复字符

但是,当我手动键入键和纯文本时,它的工作原理与预期的完全一样。此外,check50的“预期”结果似乎与输出完全相同,因此错误之处并不明显。

我的代码如下:

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

int get_validkey(string A);

int main(int argc, string argv[])
{
    if (argc != 2)
    {
        printf("useage: ./substitution key
");

        return 1;
    }


        int validation = get_validkey(argv[1]);
        if (validation == 1)
        {
            printf("key must contain 26 alphabetical characters
");

            return 1;
        }

            // prompting user for plaintext
            string plaintext = get_string("plaintext: ");
            printf("ciphertext: ");

            int length = strlen(plaintext);

            for (int c = 0; c <= length ; c++)
            {
                // printing any non-alphabet characters unchanged
                if (plaintext[c] < 'A' || (plaintext[c] > 'Z' && plaintext[c] < 'a') || plaintext[c] > 'z')
                {
                    printf("%c", plaintext[c]);
                }
                else
                {
                    for (int b = 0; b <= 25; b++)
                    {
                        if (plaintext[c] == 65 + b)
                        {
                            char upper = argv[1][b];
                            int up = isupper(upper);
                            if (up == 0)
                            {
                                upper = toupper(upper);
                                printf("%c", upper);
                            }
                            if (up != 0)
                            {
                                printf("%c", upper);
                            }

                        }
                        else if (plaintext[c] == 97 + b)
                        {
                            char lower = argv[1][b];
                            int low = islower(lower);
                            if (low == 0)
                            {
                                lower = tolower(lower);
                                printf("%c", lower);
                            }
                            if (low != 0)
                            {
                                printf("%c", lower);
                            }

                        }

                    }

                }

            }
            printf("
");
            return 0;

}

// function assesses if the key input is valid and returns 0 if it is and 1 if it is not
int get_validkey(string A)
{
    int inputlength = strlen(A);
    if (inputlength != 26)
    {
        return 1;
    }
    else
    {

        for (int g = 0; g < 26; g++)
        {
            // checks if the character is non alphabetical
            if (A[g] < 'A' || (A[g] > 'Z' && A[g] < 'a') || A[g] > 'z')
            {
                return 1;
            }
            // scans all characters before A[g] to see if it has already been used
            for (int k = (g - 1); k >= 0; k--)
            {
                if (A[k] == A[g])
                {
                    return 1;
                }
                // also checks if different case of the same character has been used
                if (A[k] == A[g] + 32)
                {
                    return 1;
                }
                if (A[k] == A[g] - 32)
                {
                    return 1;
                }
            }
            // scans all characters after A[g] to check if it has been used already. (Not sure if this is necessary)
            for (int l = (g + 1); l < 26; l++)
            {
                if (A[l] == A[g])
                {
                    return 1;
                }
                // also checks if a different case of the same letter is used
                if (A[l] == A[g]  + 32)
                {
                    return 1;
                }
                if (A[l] == A[g] - 32)
                {
                    return 1;
                }
            }

        }
        return 0;
    }

}

我对编程非常陌生,任何帮助将不胜感激。

我看不到我的pset2替换代码丢失了。当我使用check50测试程序时,它返回以下结果::) replacement.c存在:) replacement.c编译:(将“ A”加密为“ Z” ...

答案

[不必担心这是来自check50的错误,我在解决问题时遇到了同样的问题;我的意思是,即使错误也表明该代码是正确的

以上是关于CS50-pset2-替换的主要内容,如果未能解决你的问题,请参考以下文章

CS50 - pset2 - 维吉尼

Vigenere cs50 Pset2 末尾的额外字符

关于 CS50 pset2 vigenere

CS50 Pset2。维吉内尔。大文本到低键,反之亦然问题

如何在不使用 argv 的情况下获取字符串数组 - CS50 pset2

CS50 PSET2:根本不知道如何实现 isalpha 以便检查每个命令行参数