cs50 - pset 2 - программа замены - PullRequest
0 голосов
/ 03 августа 2020

Я выполнял cs50 pset 2 - подстановку, где мы должны зашифровать открытый текст, используя ключ, указанный пользователем в командной строке, но следующий код не запрашивает ввод. Что я делаю не так? Любая помощь будет принята с благодарностью!

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

int check(int c, string key);

int main(int argc, string argv[])
{
    int checkR = check(argc, argv[1]);
    if(checkR == 1)
    {
        return 1;
    }
    else
    {
        string key = argv[1];
        string ptext = get_string("plaintext: ");
        int len = strlen(ptext);
        char ctext[len];
        for (int i = 0; i < len; i++)
        {
            if(isupper(ptext[i]))
                ctext[i] = toupper(key[(int)ptext[i] - 65]);
            else if(islower(ptext[i]))
                ctext[i] = tolower(key[(int)ptext[i] - 97]);
            else
                ctext[i] = ptext[i];
        }
        printf("ciphertext: %s\n", ctext);
        return 0;
    }
}

int check(int c, string key)
{
    int keyL = strlen(key);
    
    if(c != 2)
        return 1;
        
    else if(keyL != 26)
        return 1;
    
    for(int i = 0; i < keyL - 1; i++)
    {
        for(int j = i; j < keyL; j++)
        {
            if(key[i] == key[j])
                return 1;
        }
    }
    
    return 0;
}

1 Ответ

2 голосов
/ 03 августа 2020

Ответ на вопрос

В функции check вы инициализировали внутренний l oop как int j = i. Следовательно, на первой итерации всегда будет истинным key[i] == key[j]. Затем 1 возвращается из check и предотвращает печать приглашения функцией main. Инициализация должна быть int j = i + 1.

Другие ошибки

Во-первых, делать int keyL = strlen(key); перед проверкой c плохо, потому что key (argv[1]) может быть NULL когда c (argc) меньше 2.

Во-вторых, printf("ciphertext: %s\n", ctext); в этом коде вызовет неопределенное поведение , потому что то, что хранится в ctext, является не завершается NUL. char ctext[len]; должно быть char ctext[len+1]; и ctext[len]='\0'; должно быть добавлено перед printf("ciphertext: %s\n", ctext);.

...