Шифр Vigenere в CS50 Segfau

Я не опытный кодер. Пожалуйста, не судите за плохой стиль. Я столкнулся с проблемой с шифром vingenere, который продолжает давать мне segfau

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

int main(int argc,string argv[])
    {
       while (argc!=2)
       {
        printf("Incorrect input\n");
        return 1;
       }

    printf("plaintext:");
    string plaintext=get_string();

    string num=argv[1];
    int keylength=strlen(num);

    for (int j=0, n=strlen(plaintext); j<n; j++)
    {
        char letter=plaintext[j];
        if (isalpha(letter))
        {

Это является причиной ошибки Segmantation Fault. Если я не проверяю, есть ли num в верхнем или нижнем регистре, код работает нормально.

if (isupper(letter))
            {
                if (isupper(num))
                {
                    printf ("%c",((((letter-65)+(num[j%keylength]-65))%26)+65));
                }
                else
                {
                    printf ("%c",((((letter-65)+(num[j%keylength]-97))%26)+65));
                }
             }
            else
            {
                if (isupper(num))
                {
                    printf ("%c",((((letter-97)+(num[j%keylength]-65))%26)+97));
                }

               else
              {
                   printf ("%c",((((letter-97)+(num[j%keylength]-97))%26)+97));
               }
           }
        }
        else
        {
            printf ("%c",letter);
        }
    }
    printf("\n");
    return 0;
    }

1 ответ

Решение

Скорее всего, вы имели в виду

if (isupper(num[j % keylength))

Передача строки (на самом деле char *) чтобы isupper() является неопределенной операцией и может вызывать странные эффекты в зависимости от того, как isupper() реализовано. Реализация GNU ---

#define __ctype_lookup(__c) ((__ctype_ptr__+sizeof(""[__c]))[(int)(__c)])
#define isupper(__c) ((__ctype_lookup(__c)&(_U|_L))==_U)

--- использует таблицу поиска со всеми видами забавных математических указателей и приведением под капотом, так что это, вероятно, позволяет char * передается без жалоб компилятора, но это определенно не даст хороших результатов. Измени свой if заявление, и оно должно работать лучше.

Другие вопросы по тегам