CS50 Цезарь ошибка сегментации - PullRequest
0 голосов
/ 21 марта 2020

Я новичок здесь и работаю над вторым домашним заданием Цезарь cs50, кажется, что большая часть моего обзора верна, за исключением последнего - я не могу справиться с ситуацией отсутствия argv [1], что означает, что я только печатаю. / Цезарь, он вернет ошибку сегментации. Мне интересно, почему этот код if (argc != 2) не может вернуть 0, когда arg c == 1, однако он работает, когда arg c> 1, я нахожу это странным. Может кто-нибудь мне помочь?? Заранее спасибо!

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



int check_the_key(int argc, string y);

int main(int argc, string argv[])
{
    string x = argv[1];
    int y = argc;
    int k = check_the_key(y, x);

    if (k == 0)
    {
        printf("ERROR!!!!!\n");
        return 1;
    }
    else
    {
        // printf("The key is %i\n", k);

        string text = get_string("Input your text:");
        int i;
        int n;
        printf("ciphertext: ");
        for (i = 0, n = strlen(text); i < n; i++)
        {
            if (islower(text[i]))
            {
                printf("%c", (text[i] - 97 + k) % 26 + 97 );
            }
            else if (isupper(text[i]))
            {
                printf("%c", (text[i] - 65 + k) % 26 + 65);
            }
            else
            {
                printf("%c", text[i]);
            }

        }
        printf("\n");
        return 0;


    }

}

int check_the_key(int argc, string y)
{   
    int number = argc;
    string key = y;
    int numberkey = atoi(key);

    if (argc != 2)
    {

        return 0;
    }

    else 
    {
        if (numberkey > 0)
        {
            return numberkey;
        }
        else
        {
            return 0;
        }
    }


}

1 Ответ

0 голосов
/ 21 марта 2020

Я знаю, что происходит! Поскольку мне нужно передать какое-то значение в atoi(), если я вызову только ./caesar, я не могу передать значение в atoi(), поэтому это вызывает ошибку сегментации. Это означает, что мне нужно немного изменить порядок кода, поместив int numberkey = atoi(key); в остальное l oop. Таким образом, код будет запускаться сначала if (argc != 2), если нет, то go до следующего шага! Вот код после изменения.

int check_the_key(int argc, string y)
{   
    int number = argc;
    string key = y;


    if (argc != 2)
    {

        return 0;
    }

    else 
    {
        int numberkey = atoi(key);
        if (numberkey > 0)
        {
            return numberkey;
        }
        else
        {
            return 0;
        }
    }


}
...