pset 2- Caesar.输出匹配但检查失败50 [已关闭]

omqzjyyz  于 2022-12-11  发布在  其他
关注(0)|答案(2)|浏览(117)

**已关闭。**此问题为not reproducible or was caused by typos。目前不接受答案。

这个问题是由一个打字错误或一个无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
2天前关闭。
Improve this question
对不起,我知道以前有人问过这个问题,但是我已经看过所有的答案,没有任何结果!请帮助。当我检查实际输出和预期输出时,它们是匹配的,但是在check 50中它给出了一个错误消息。下面是check 50结果的链接:https://submit.cs50.io/check50/6d939efb8a55e3fadec1c60952311f6198cd0eb0

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

char crypt(int k,char w)
{
    if ('a'<= w && w <='z')
    {
        return (((w-'a')+ k)%26+'a');
    }
    else if ('A' <= w && w <= 'Z')
    {
        return (((w -'A') + k) % 26 + 'A');
    }
    else
    {
        return (w);
    }
}

int main(int argc, string argv[])
{
    //input check
    if (argc != 2)
    {
        printf("Usage: ./caesar key\n");
        return 1;
    }

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

    int key = atoi(argv[1])%26;
    //input

    string plain = get_string("plaintext:  ");

    //crpypt starts

    printf("ciphertext: ");
    int lng = strlen(plain)+1;
    for (int a = 0; a < lng ;a++)
    {
        printf("%c", crypt(key, plain[a]));
    }

    printf("\n");
}

嗨,当我查看预期和实际输出时,一切似乎都很完美,但它出错了

7qhs6swi

7qhs6swi1#

问题是您还使用printf将终止空字符打印到标准输出。此字符不可打印,因此您看不到它,但check50确实检测到它,因此报告程序失败。
该回路

for(int a=0; a<lng ;a++)
{
    printf("%c",crypt(key,plain[a]));
}

将运行strlen(plain)+1次迭代,因为这是您将变量lng设置为的值。
您应该改为将lng的值设置为strlen(plain),以防止打印终止空字符。

ttcibm8c

ttcibm8c2#

@w是正确的。
此外,代码可以避免2次传递字符串,而只传递1次。

// int lng = strlen(plain)+1;
// for (int a = 0; a < lng ;a++)

for (int a = 0; plain[a] != '\0'; a++)

相关问题