#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;
}