Дополнительные символы в конце Vigenere CS50 Pset2 - PullRequest
0 голосов
/ 14 мая 2019

Я новичок в кодировании и занимаюсь этим пару недель.Сейчас я беру курс cs50, и я написал код для pset2 vigenere.Когда я использовал check50, я понял, что он хочет, чтобы я учитывал пробелы и не буквы, не пропуская ключ вперед.

Я добавил "j--;"и, хотя код верен, теперь он создает дополнительные случайные символы в конце зашифрованного текста.

Кроме того, при проверке argv [1] только для букв в моем коде, у меня есть оператор if, который имеет "int key = argv [1] [i];"в теле.Он ничего не делает, но я не знаю, как заставить его продолжать проверять следующий символ, не имея пустого тела, что недопустимо.

Любая помощь будет принята с благодарностью!Большое спасибо!

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


int main(int argc, string argv[0])

{
    //making sure it is not more than one command line
    if (argc != 2)
    {
        printf("Usage: ./vigenere key \n");
        return 1;
    }

    //if it is one command line, making sure the input is just letters      
    if (argc == 2)
    {
        for (int i = 0, n = strlen(argv[1]); i < n; i++)
        {
            if (isalpha(argv[1][i]))
            {    
                int key = argv[1][i];
            }
            else
            {
                printf("Usage: ./vigenere key \n");
                return 1;
            }
        }   

    }
    //asking user for input text
    string plaintext = get_string("plaintext: ");
    printf("ciphertext:");

    //going through a loop to turn plain text into ciphertext 
    int i = 0; 
    int n = strlen(plaintext); 
    string key = argv[1];


    //looping through the key    
    while (i < n)

    {

        for (int j = 0, m= strlen(key); j < m; j++, i++)

        {   
            //using the asci of each char as an int
            int asc = (plaintext[i]);
            int k = key[j];
            //if lowercase
            if (k >= 97 && k <= 122)
            {
                k -= 97;
            }
            else
            {
                k -= 65;
            }

            //if lowercase
            if (asc >= 97 && asc <= 122)
            {
                printf("%c", ((((asc - 97) + k) % 26) + 97));
            }
            //if uppercase
            else
            {
                if (asc >= 65 && asc <= 90)
                {
                    printf("%c", ((((asc - 65) + k) % 26) + 65));
                }
                //if non-letter
                else
                {  
                    printf("%c", asc);
                    j--;

                }
            }

        }  


    }


    printf("\n");

}      

Это ожидаемые и фактические результаты:

key: baz
plaintext: hello, world!
expected ciphertext: iekmo, vprke!

actual ciphertext:   iekmo, vprke!!pu

1 Ответ

2 голосов
/ 14 мая 2019

Поскольку программа увеличивает i здесь for (int j = 0, m= strlen(key); j < m; j++, i++), она позволяет читать после окончания открытого текста. Цикл while не будет оценивать i до окончания цикла for. И это может привести к бесконечному циклу, в зависимости от содержимого памяти после окончания открытого текста. Если он никогда не сталкивается с чем-то в диапазоне a-z или A-Z, он будет j-- навсегда.

Вам нужно выйти из цикла for, если и когда i == strlen(plaintext).

...