cs50 pset2 caesar --- ошибка зашифрованного текста - PullRequest
0 голосов
/ 21 марта 2020

Я исправил свою проблему проверки, но теперь я продолжаю получать только одну строку символов в качестве моего зашифрованного текста, и я не могу найти проблему. это, наверное, что-то маленькое, что я просто скучаю, но любая помощь приветствуется. сверху мое окно терминала, а снизу мой код.

~/caesar/ $ make caesar
clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow    caesar.c  -lcrypt -lcs50 -lm -o caesar
~/caesar/ $ ./caesar 12
plaintext: "world, say hello!"
ciphertext: aaaaaaaaaaaaaaaaaaa 




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

int main(int argc, string argv[])
{
    if(argc == 2)
    {
        int n = strlen(argv[1]);
        int i = 0;
        for(i = 0; i < n; i++)
        {
            if(!isdigit(argv[1][i]))
            {
                printf("Usage: ./caesar key\n");
                return 1;
            }
        }
        int key = atoi(argv[1]);
         string text = get_string("plaintext: ");
            printf("ciphertext: ");
            int l = 0;
            int t = strlen(text);
        for(l = 0; l < t; l++)
         {
            if(isupper(text[i]))
            {
                printf("%c", (((text[i] - 'A') + key) % 26) + 'A');
            }

            else if(islower(text[i]))
            {
                printf("%c", (((text[i] - 'a') + key) % 26) + 'a');
            }

            else
            {
                printf("%c", text[i]);
            }
        }
    }
     else
    {
        printf("Usage: ./caesar key\n");
        return 1;
    }
    printf("\n");
    return 0;
}

1 Ответ

1 голос
/ 21 марта 2020

Вы всегда тестируете текст [i] без увеличения i, вам следует протестировать текст [l]

int main(int argc, string argv[])
{
    if(argc == 2)
    {
        int n = strlen(argv[1]);
        int i = 0;
        for(int l = 0; l < n; l++)
        {
            if(!isdigit(argv[1][l]))
            {
                printf("Usage: ./caesar key\n");
                return 1;
            }
        }
        int key = atoi(argv[1]);
         string text = get_string("plaintext: ");
            printf("ciphertext: ");
            int t = strlen(text);
        for(int l = 0; l < t; l++)
         {
            if(isupper(text[l]))
            {
                printf("%c", (((text[l] - 'A') + key) % 26) + 'A');
            }

            else if(islower(text[l]))
            {
                printf("%c", (((text[l] - 'a') + key) % 26) + 'a');
            }

            else
            {
                printf("%c", text[l]);
            }
        }
    }
     else
    {
        printf("Usage: ./caesar key\n");
        return 1;
    }
    printf("\n");
    return 0;
}

Этот код более чистый.

...