Почему мой вывод является ошибкой сегментации? - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь создать шифр в C и прохожу цикл по двум массивам, чтобы сравнить символы предложения со значениями ACSII алфавита, а затем заменить эти буквы на зашифрованные значения алфавита. Вот что я получил до сих пор:

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

int main(void)
{
    string test = "JTREKYAVOGDXPSNCUIZLFBMWHQ";
    string sentence = "DEEEATSXYLAPHONEELEPHANTTY";
    int alphabet[26];

    for (int i = 0; i < 26; i++)
    {
        alphabet[i] = i + 65;
    }

    for (int i = 0; i < 26; i++)
    {
        for (int j = 0; j < 26; j++)
        {
            if (sentence[i] == alphabet[j])
            {
                sentence[i] = test[j];
            }
        }
    }

    printf("%s", sentence);

}

Таким образом, на выходе получается «ошибка сегментации». Мне кажется, что я прошел через это должным образом, но тогда я не впервые чувствовал себя уверенно, но выглядел глупо.

1 Ответ

2 голосов
/ 27 марта 2020

valgrind позволяет легко отследить эту проблему:

==29905== Process terminating with default action of signal 11 (SIGSEGV)
==29905==  Bad permissions for mapped region at address 0x10A01F
==29905==    at 0x109207: main (sf.c:23)

Это утверждение sentence[i] = test[j], которое пытается записать в const char * (проверьте typedef из string). Чтобы исправить это, вам нужно будет предоставить sentence свою собственную копию данных для работы, например:

char sentence[] = "DEEEATSXYLAPHONEELEPHANTTY";

Теперь назначение записывает локальные данные, и, по крайней мере, в моей системе , valgrind (и асан) запускаются без жалоб.

...