代码之家  ›  专栏  ›  技术社区  ›  Pot Noodle

Caesar Check50失败

  •  0
  • Pot Noodle  · 技术社区  · 7 年前

    我正在努力解决凯撒问题,请参阅下面的代码:

    // 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");
    }
    

    不幸的是,当我运行“check50”时,仍收到以下失败消息

    :) 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]
    

    有人能帮忙吗?

    自己运行“check50”的示例,输出看起来很好。如果你理解我的意思,我想可能是电脑读取数据的方式与屏幕上的不同。

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

    2 回复  |  直到 5 年前
        1
  •  0
  •   Mathieu Shrikanth M D    7 年前

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

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

    应该是

    int ptii = 0;
    for (; ptii < ptic; ptii++)
    
        2
  •  0
  •   YGautomo    6 年前

    我猜您有一个额外的字符来输出printf,尽管它看起来很相似,因为 int ptic = strlen(pti);

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

    应更改为

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