cs50 pset2 caesar, либо ошибка сегментации, либо несовместимое преобразование - PullRequest
0 голосов
/ 06 августа 2020

Это мой код для задачи caesar из набора задач 2 из CS50 :

int main(int argc, string argv[])
{
    if (argc == 2 && check_integer(argv[1]) == true)
    {
        int key = atoi(argv[1]);
        string plaintext = get_string("plaintext: ");
        string ciphertext[strlen(plaintext)];
        for (int i = 0, n = strlen(plaintext); i < n; i++)
        {
            char a = plaintext[i], b;
            if (a >= 'A' && a <= 'Z')
            {
                if (a + (key % 26) > 'Z')
                {
                    b = a - (26 - (key % 26));
                }
                else
                {
                    b = a + (key % 26);
                }
            }
            if ((a >= 'a' && a <= 'z'))
            {
                if (a + (key % 26) > 'z')
                {
                    b = a - (26 - (key % 26));
                }
                else
                {
                    b = a + (key % 26);
                }
            }
            ciphertext[i] = b;
        }
        printf("ciphertext: %s", ciphertext);
        return 0;
    }
    else
    {
        printf("Usage: ./caesar key\n");
        return 1;
    }
}

Проблема c - это только строка зашифрованного текста. В этом текущем коде говорится, что преобразование из char b в строку chiphertext [i] несовместимо. Поэтому я попытался удалить массив при инициализации и инициализировать его значением NULL, но затем он сказал ошибку сегментации. И есть еще одна ошибка, в которой говорится, что нельзя печатать зашифрованный текст, потому что формат предполагает, что это символ, в то время как я помещаю строку Stronghold. Что мне делать?

Вот изображение ошибки .

1 Ответ

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

Поскольку string - это typedef для char*, ciphertext - это массив char указателей. Следовательно, присвоение char, когда ожидается указатель, приведет к плохим результатам.

Вы действительно не хотите, чтобы ciphertext был массивом string s. Вы хотите, чтобы это была другая строка того же размера, что и plaintext. Вы можете сделать это с помощью

string ciphertext=malloc(strlen(plaintext)+1); // The +1 is for the null-terminator.

Кроме того, я бы вычислил strlen(plaintext) один раз внутри дважды. До

n=strlen(plaintext);
string ciphertext=malloc(n+1);
...