C: Перепрошивка для ввода значения в argv [] — без закрытия по ошибке — шифр Цезаря

#c #cs50 #caesar-cipher

#c #cs50 #caesar-cipher

Вопрос:

Я новичок в программировании и прохожу гарвардский курс CS50 по eDX. У нас было назначение для шифра цезаря, я вполне доволен своим кодом, хотя он и не идеален. Но я не уверен, как заставить программу no закрываться по ошибке, если не предоставлены какие-либо аргументы.

Согласно назначению курса, это должно быть возможно, и вывод должен быть «Использование: ./ caesar key» — это работает, если я использую строку вместо целых значений или если вставлено несколько значений. Но с пустыми значениями (./caesar) Я получаю сообщение об ошибке в терминале. Есть ли какой-либо способ избежать этого и просто закрыть программу, например, введя строку? Уже проверил несколько разделов и не смог найти, как это сделать.

Спасибо

PS: я уже отправил назначение, но, на мой взгляд, я все еще возвращаюсь к этой теме и хочу знать, возможно ли это и как : D

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

int main(int argc, string argv[])
{
    int k = atoi(argv[1]);
    if (argc != 2 || argv[1] == NULL || k <= 0)
    {
        printf("Usage: ./caesar keyn");
        return(1);
    } 
    string p = get_string("Plaintext: ");
    printf("Ciphertext: ");

    //incrementing each letter
    for (int i = 0, n = strlen(p); i < n; i  )
    {
        //for capital letters
        if (p[i] >= 65 amp;amp; p[i] <= 90)         
        {
            //refreshing alphabet char counting to 65
            if (p[i]   k > 90)
            {
                int m = ((p[i]   k) - 90);
                char c = 64   m; 
                printf("%c", c);
            }
            else
            {
                printf("%c", p[i]   k);
            }
        }
        //for non-capital letters
        if (p[i] >= 97 amp;amp; p[i] <= 122)         
        {
            //refreshing alphabet char counting to 97
            if (p[i]   k > 122)
            {
                int m = ((p[i]   k) - 122);
                char c = 96   m; 
                printf("%c", c);
            }
            else
            {
                printf("%c", p[i]   k);
            }
        }
        //for non-letter characters
        if (p[i] < 65 || p[i] > 122)
        {
            printf("%c", p[i]);
        }
    }
    printf("n");
}
  

Ответ №1:

Вам нужно проверить значение argc перед началом доступа argv . Таким образом, вместо того, чтобы устанавливать k и затем выполнять эти проверки, выполните большинство проверок, затем назначьте, k а затем проверьте k , является ли значение допустимым.

 int k;
if (argc != 2 || argv[1] == NULL)
{
    printf("Usage: ./caesar keyn");
    return(1);
}
k = atoi(argv[1]);
if (k <= 0)
{
    printf("Usage: ./caesar keyn");
    return(1);
}