CS50 Caesar cypher прерывается после проверки аргумента командной строки

#c #command-line-arguments #cs50 #caesar-cipher

#c #аргументы командной строки #cs50 #caesar-cipher

Вопрос:

Я писал код для Caesar’s cypher (кодирование букв путем сдвига их на введенное число). Он работал правильно, пока я не ввел условие, гарантирующее, что введенный ключ является цифрой и каким-то образом нарушает работу кода.

Я не понимаю, как это условие впоследствии соотносится с кодом и что не так.

Не мог бы кто-нибудь помочь?

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

int main(int argc, string argv[])

{
    if (argc != 2)
    {
        printf("Usage: ./caesar keyn");
        return 1;
    }

    for (int j = 0; j < strlen(argv[1]); j  )
    {
        if (!(isdigit(argv[1][j])))
        {
            printf("Usage: ./caesar keyn");
            return 1;
        }

    }


    int k = atoi(argv[1]);
    if (argc == 2 amp;amp; k > 0)

    {
        string s = get_string("plaintext: ");

        int m = k % 26;

        //introducing an array type char of string length size
        char cypher[strlen(s)];


        for (int i = 0; i < strlen(s);  i  )
        {
            //checking if it's a letter, if yes then next if
            if (isalpha(s[i]))
            {
                //checking if it's uppercase
                if (isupper(s[i]))
                {
                    cypher[i] = (s[i]   m);
                    //make a round if it's beyond Z
                    if (cypher[i] > 'Z')
                    {
                        cypher[i] = cypher[i] - 26;
                    }

                }
                // checking if it's lowercase
                else if (islower(s[i]))
                {
                    //if it falls beyond ascii table
                    if ((s[i]   m) > 126)
                    {
                        cypher[i] = (s[i] - 26   m );
                    }
                    else
                    {
                        cypher[i] = (s[i]   m);
                    }
                    //make a round if it's beyond z
                    if (cypher[i] > 'z')
                    {
                        cypher[i] = cypher[i] - 26;
                    }
                }

            }
            // if it's not a letter - keep the initial character, write it in the cypher
            else
            {
                cypher[i] = s[i];
            }
        }

        printf("ciphertext: %sn", cypher);
        return 0;

    }



}
 

Комментарии:

1. каким-то образом нарушает работу кода . Пожалуйста, сообщите нам, какую ошибку или неправильное поведение вы наблюдаете.

2. Если вы закомментируете часть for (int j = 0; j < strlen(argv[1]); j ) { if (!(isdigit(argv[1][j]))) { printf("Usage: ./caesar keyn"); return 1; } } , она полностью корректна. Но когда я добавляю его, он выдает совершенно неправильные шифры.

3. char cypher[strlen(s)]; Вы не завершаете массив NUL. Что означает, что это недопустимая строка C. Если исправление по-прежнему не работает, пожалуйста, укажите точные входные данные, ожидаемый результат и фактический результат.

4. @kaylum извините, не понял, что вы имеете в виду. Я объявляю массив символов размером, равным размеру строки s — той, которую вы получаете в качестве входных данных

5. Строки в C должны заканчиваться символом '' (NUL). Таким образом, размер массива должен быть на единицу больше: char cypher[strlen(s) 1]; и затем, прежде printf чем вам понадобится cypher[i]='';

Ответ №1:

strlen в C не учитывает нулевой символ, длина массива должна быть [strlen(s) 1] и должен быть добавлен символ