C: перекомпоновка для ввода значения в argv [] - без закрытия по ошибке - Цезарь Шифр - PullRequest
1 голос
/ 15 марта 2019

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

Согласно назначению курса, это должно быть возможно, и вывод должен быть «Использование: ./caesar ключ» - это работает, если я использую строку вместо целочисленных значений или если вставлено несколько значений.Но с пустыми значениями (./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 key\n");
        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 && 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 && 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 Ответ

3 голосов
/ 15 марта 2019

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

int k;
if (argc != 2 || argv[1] == NULL)
{
    printf("Usage: ./caesar key\n");
    return(1);
}
k = atoi(argv[1]);
if (k <= 0)
{
    printf("Usage: ./caesar key\n");
    return(1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...