CS50 / BEGINNER - Ошибка сегментации во вложенном для l oop in C - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь написать код, который будет брать каждое di git из ввода строки открытого текста и, если это буква, выводить другую букву, как определено ключом подстановки (26-буквенный ключ).

Другими словами, если алфавит был «abcd», а предоставленный ключ был «hjkl», при вводе «bad» будет выведено «jhl».

// Regular alphabet is to be used as comparison base for key indexes //
string alphabet = "abcdefghijklmnopqrstuvwxyz";

// Prompt user for input and assign it to plaintext variable //
string plaintext = get_string("plaintext:  ");

Не буквы должны быть напечатано как есть.

Моя идея заключалась в том, чтобы l oop вводить di git через каждый индекс в алфавите, ища соответствующую букву, и, если она найдена, вывести тот же индексный символ из строки. (сбивает с толку, я думаю)

Этот l oop, однако, возвращает segfault, когда я запускаю его, но не при отладке:

// Loop will iterate through every ith digit in plaintext and operate the cipher //
for (int i = 0; plaintext[i] != '\0'; i++) {
    // Storing plaintext digit in n and converting char to string //
    char n[2] = "";
    n[0] = plaintext[i];
    n[1] = '\0';

    // If digit is alphabetic, operate cipher case-sensitive; if not, print as-is //
    if (isalpha(n) != 0) {
        for (int k = 0; alphabet[k] != '\0'; k++) {
            char j[2] = "";
            j[0] = alphabet[k];
            j[1] = '\0';

            if (n[0] == j[0] || n[0] == toupper(j[0])) {
                if (islower(n) != 0) {
                    printf("%c", key[k]);
                    break;
                } else {
                    printf("%c", key[k] + 32);
                    break;
                }
            }
        }
    } else {
        printf("%c", (char) n);
    }
}

Что не так? Я искал помощь в Интернете, но большинство источников не очень удобны для начинающих.

1 Ответ

0 голосов
/ 10 июля 2020

Кажется, ваш код работает, за исключением одной ошибки: программа вылетает на

isalpha(n)

Потому что вы объявили

char n[2]

в параметре есть указатель типа char*. Но islower принимает только параметр int, поэтому просто запишите его как

isalpha(n[0])

То же самое для islower.

...