Ошибка сегментации из-за отсутствия аргумента командной строки (argv [1])

#c #cs50 #caesar-cipher

#c #cs50 #caesar-cipher

Вопрос:

Этот сегмент кода предназначен для проверки, ввел ли пользователь только один числовой аргумент командной строки, и возвращает код ошибки «1», если это не так. У меня есть код, настроенный таким образом, что он сначала проверяет, является ли argc чем-то иным, кроме 2. К сожалению, я все еще получаю ошибки сегментации, если не введен аргумент командной строки, и я не уверен, почему этот код не улавливает нулевое количество аргументов командной строки.

Я попытался переместить формулу «if (argc !=2)» выше всего оператора «for», чтобы попытаться с самого начала выявить проблему с аргументом командной строки, но я получил тот же результат.

Мой вопрос в том, почему я получаю ошибку сегментации, когда не указан аргумент командной строки, и чего мне не хватает, чтобы убедиться, что программа не выдает ошибку сегментации без аргумента командной строки?

Из-за политики курса я буду предоставлять только рассматриваемый сегмент кода.

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


int main(int argc, string argv[])
{
    // add'l variables //
    int k = atoi(argv[1]);

    for (int i = 0; i < strlen(argv[1]); i  )
    {
        if (argc != 2)
        {
            printf("Please enter only 1 command-line argument.n");
            return 1;
        }
        else if (!isdigit(argv[1][i]))
        {
            printf("Usage: ./caesar keyn");
            return 1;
        }
    }
// add'l code //
 

Ошибка, как показано в терминале

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

1. Проблема возникает в строке int k = atoi(argv[1]) , выполните argc проверку перед этим.

2. Вы получаете ошибку сегментации, потому что пытаетесь получить доступ к чему-то, чего не существует. Вы предоставляете хотя бы один аргумент командной строки (исполняемый), хотя для запуска вашего кода вам нужно как минимум 2.

Ответ №1:

Вы должны сначала проверить argc перед использованием argv[1] , потому argv[1] что может не иметь действительного указателя, если argc < 2 . Исправленная версия вашего кода может быть такой:

 #include <stdio.h>
#include <ctype.h>

int main(int argc, char *argv[])
{
    int i = 0;
    if (argc != 2) {
        printf("Please enter only 1 command-line argument.n");
        return 1;
    }
    while (isdigit(argv[1][i]))
                 i;
    if (argv[1][i] != '') {
        printf("Usage: ./caesar keyn");
        return 1;
    }

    return 0;
}