Saat ini saya sedang mengerjakan pset2 CS50x 2019, khususnya di Vigenère. Buku Nilai CS50 menunjukkan kepada saya bahwa 93% selesai setelah mengunggahnya ke GitHub.

Saya sudah mencoba beberapa cuplikan kode lain yang dapat Anda temukan online tetapi sepertinya tidak berhasil.

Berikut adalah bagian dari program saya yang membuat ciphertext:

    string k = argv[1];
    // Get the plaintext and print out the ciphertext
    string s = get_string("plaintext: ");
    printf("ciphertext: ");

    // Iterate through plaintext letter by letter
    for (int i = 0, n = strlen(s) ; i < n; i++)
    {
        int key = tolower(k[i % strlen(k)]) - 'a';

        // Check if the letter is lowercase, uppercase or neither and print out the rotated character
        if (islower(s[i]))
        {
            printf("%c", (((s[i] - 'a') + key) % 26) + 'a');
        }
        else if (isupper(s[i]))
        {
            printf("%c", (((s[i] - 'A') + key) % 26) + 'A');
        }
        else
        {
            printf("%c", s[i]);
        }
    }

    printf("\n");
    return 0;

Ada beberapa contoh dalam dokumentasi yang dapat Anda uji dengan kode Anda.

Contoh berikut tidak berfungsi dengan kode saya:

$ ./vigenere bacon
plaintext:  Meet me at the park at eleven am
ciphertext: Negh zf av huf pcfx bt gzrwep oz

Keluaran saya adalah:

$ ./vigenere bacon
plaintext: Meet me at the park at eleven am
ciphertext: Negh ne og tjs qaty bt syfvgb bm

Seperti yang Anda lihat, 4 karakter pertama benar tetapi sisanya tidak.

0
user11851244 7 Agustus 2019, 19:27

1 menjawab

Jawaban Terbaik

int key = tolower(k[i % strlen(k)]) - 'a'; ini adalah masalah.

Dari spesifikasinya:

Ingat juga bahwa setiap kali Anda menyandikan sebuah karakter, Anda harus pindah ke huruf k berikutnya, kata kunci (dan membungkus ke awal kata kunci jika Anda menghabiskan semua karakternya). Tetapi jika Anda tidak menyandikan karakter (misalnya, spasi atau tanda baca), jangan lanjutkan ke karakter berikutnya dari k!

Intinya adalah: karena plaintext dan key dijalankan pada "tarif" yang berbeda, Anda tidak dapat menggunakan indeks yang sama (dalam hal ini i) untuk keduanya. Program harus merayapi plaintext satu karakter pada satu waktu, seperti yang dilakukan di sini. Tetapi perlu cara terpisah untuk mengontrol karakter di key sehingga Anda dapat 1) melewatkan spasi/tanda baca dan 2) membungkusnya. Variabel lain untuk indeks key akan menjadi salah satu cara untuk menyelesaikannya. Mungkin ada masalah lain dalam kode, tetapi ini adalah kelemahan mendasar.

0
DinoCoderSaurus 8 Agustus 2019, 10:31