CS50 проблема Вигенера.Вне доступа, неопределенное поведение - PullRequest
0 голосов
/ 03 апреля 2019

Итак, вот решение, которое я пришел для решения проблемы V50-CS CS50;Я довольно новичок в программировании, всего несколько недель назад, поэтому я заранее прошу прощения за форму моего кода.

Проблема здесь в том, что результат не соответствует ожиданиям.

примеры:

. / Vigenere ABC

вход: привет

выход: hfnLp

. / Vigenere ABC

вход: HELLO

выход: HFN, P

. / Vigenere BACON

вход: Встретимся в парке в одиннадцать утра

выход:Neg zf av uf pCx bT gzrwEP OZ

(это должно быть "Negh zf av huf pcfx bt gzrwep oz")

Я не знаю, потому что это, кажется, работает немного, но кое-что выключено.

Я проверил почти все целые числа, которые я использую, все они действуют так, как я намеревался.

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

int main (int argc, string argv[])
{
    string k = argv[1]; //key
    string p; //plaintext
    int j = 0; //the counter for key index
    int ci; // the variable for reaching the right shifting value on both uppercase and lowercase letters
    int K;//the value of the key index shift

    if (argc != 2)
    {
        printf("input error\n");
    }
    else
    {
       p = get_string();

       for (int i = 0, n = strlen(p); i < n; i++)
       {
           if (isupper(k[j]))
           {
            ci = 65;
           }
           else
           {
            ci = 97;
           }

           K = k[j % strlen(k)] - ci;

           if (isalpha (p[i]))
           {
                printf("%c", p[i] + K);
                j++;
           }
           else
           {
            printf("%c", p[i]);
           }
       }
       printf("\n");
    }
}

1 Ответ

1 голос
/ 03 апреля 2019

После strlen(k) итераций isupper(k[j]) использует индекс после конца k.

Вы можете изменить:

if (isupper(k[j]))
{
 ci = 65;
}
else
{
 ci = 97;
}

K = k[j % strlen(k)] - ci;

на:

K = toupper(k[j % strlen(k)]) - 'A';

(Обратите внимание, что это зависит от свойства, не гарантированного стандартом C, что коды символов для букв являются последовательными и в алфавитном порядке.)

...