凯撒Check50失败

时间:2018-01-29 10:31:43

标签: cs50 caesar-cipher

我试图完成凯撒问题,请参阅下面的代码:

// INCLUDE THE APPROPRIATE LIBRARIES
#include <math.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

int eoc;
int feoc;
int eolc;
int feolc;

// INITIALIZE PROGRAMME THAT REQUIRES A COMMAND LINE ARGUMENT
int main (int argc, string argv[])
// OBTAIN A VALID KEY INPUT FROM USER
{
    int minimumkeyinput = 2;

    if (argc < minimumkeyinput)
    {
        printf("Caesar requires a Key input in order to execute e.g. ./caesar  2\n");
        return 1;
    }

    // KEY CONVERSION (kc) DECLARED AS AN INT CONVERTED FROM ARGV
    int kc = atoi(argv[1]);
    if (kc < 0)
    // ENSURE A POSITIVE INTEGER IS GIVEN AS PROGRAMME "KEY"
    {
        printf("programme requires a positive integer in order to execute\n");
        return 1;
    }

    // OBTAIN PLAIN TEXT INPUT (pti) FROM USER
    string pti;
    do
    {
        printf("plaintext: ");
        pti = get_string();
    }
    while (pti == NULL);

    // BEGIN ENCRYPTION PROCESS OF PLAINTEXT INPUT
    printf("ciphertext: ");

    int ptic = strlen(pti);
    // ITERATE OVER PLAINTEXT

    int ptii = 0;
    for (; ptii <= ptic; ptii++)
    {
        // SHIFT THE CHARACTERS OF PLAINTEXT INPUT (pti) TO ENCRYPTED OUTPUT (eo) BY USER KEY CONVERSION (kc)
        // CONVERT USER INPUTS ENCRYPTION RESULT INTO AN ALPHABETICAL INDEX
        // LOOP AROUND THE APLHABET IF REQUIRED BEFORE PRINTING TO SCREEN (UPPPERCASE ASCII 65-90)
        eoc = (pti[ptii] -65 + kc) %26;

        // LIMITING THE SCOPE OF THE UPPERCASE LOOP
        // CONVERT CHARACTERS FROM ALPHABETICAL INDEX BACK TO ASCII INDEX (UPPERCASE)
        if (isalpha (pti[ptii]))
        {
            if isupper (pti[ptii])
            {
                feoc = eoc + 65;
                printf("%c", feoc);
            }
            // LOOP AROUND ALPHABET IF REQUIRED BEFORE PRINTNG TO SCREEN (LOWERCASE ASCII 97 - 122)
            // LIMIT THE SCOPE OF THE LOWERCASE LOOP

            if islower (pti[ptii])
            {
                eolc = (pti[ptii] -97 + kc) %26;
                // CONVERT CHARACTERS FROM ALPHABETICAL INDEX BACK TO ASCII INDEX (LOWERCASE)
                feolc = eolc + 97;
                printf("%c", feolc);
            }
        }
        if (isalpha (pti[ptii]) == false)
        {
            printf("%c", pti[ptii]);
        }
    }
    printf("\n");
}

不幸的是,当我运行&#39; check50&#39;

时,我仍然收到以下失败消息
:) caesar.c exists.
:) caesar.c compiles.
:( encrypts "a" as "b" using 1 as key
expected "ciphertext: b\n", not "ciphertext: b\x..."
:( encrypts "barfoo" as "yxocll" using 23 as key
expected "ciphertext: yxo...", not "ciphertext: yxo..."
:( encrypts "BARFOO" as "EDUIRR" using 3 as key
expected "ciphertext: EDU...", not "ciphertext: EDU..."
:( encrypts "BaRFoo" as "FeVJss" using 4 as key
expected "ciphertext: FeV...", not "ciphertext: FeV..."
:( encrypts "barfoo" as "onesbb" using 65 as key
expected "ciphertext: one...", not "ciphertext: one..."
:( encrypts "world, say hello!" as "iadxp, emk tqxxa!" using 12 as key
expected "ciphertext: iad...", not "ciphertext: iad..."
:) handles lack of argv[1]

有人可以帮忙吗?

运行&#39; check50&#39;的示例我自己,输出看起来很好。我认为,如果您了解我的意思,计算机读取数据的方式可能与屏幕上的数据不同。

我的猜测是,我错过了一个简单的步骤,但是在我的生命中找不到它。

感谢我的代码的所有帮助和输入

提前谢谢

PotNoodle。

2 个答案:

答案 0 :(得分:0)

由于我没有<cs50.h>可用,我无法测试我写的内容,但似乎您的for循环条件错误:

int ptii = 0;
for (; ptii <= ptic; ptii++)

应该是

int ptii = 0;
for (; ptii < ptic; ptii++)

答案 1 :(得分:0)

我想您可能还有一个额外的字符来输出printf,尽管它看起来很像,因为int ptic = strlen(pti);的额外循环

int ptii = 0;        
for (; ptii <= ptic; ptii++) 

应更改为

int ptii = 0;
for (; ptii < ptic; ptii++)