Проверка аргументов строки cmd в C - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь получить 2 параметра из строки cmd в C. Второе число не должно превышать 100. Однако при запуске программы с 23 405 она выполняется без ошибок.

int main(int argc, char * argv[]){
    char *inputs;
    int input1= strtol(argv[1], &inputs, 10);
    int input2= strtol(argv[2], &inputs, 10);

   if ((*inputs!='\0') || (argc < 3) || (input1 > 1) || (input2 >= 100) 
   || (input1 >= input2))
   {
   printf("Error.");
   return 1}
  return 0;
}

Я новичок в C, поэтому любая помощь очень ценится!

Ответы [ 4 ]

0 голосов
/ 09 ноября 2018

при запуске программы с 23 405. Она выполняется без ошибок.

Отправленный код не является верным кодом return 1}, синтаксическая ошибка.

Предполагается, что это был почтовый сбой, а return 1;} было закодировано:

В коде отсутствует объявление strtol() и printf().

Добавьте их, чтобы избежать неопределенного поведения:

#include <stdio.h>
#include <stdlib.h>

Я подозреваю, что код умер из-за некоторого неопределенного поведения , и ничего не печатал. При этом ОП неверно предполагал успех.


Другие проблемы, если сообщаемое «программа с 23 405» также не совсем верно:

Передача неверного указателя

Вызов strtol(argv[1], &inputs, 10) с недопустимым argv[1] - неопределенное поведение. Валидация argv[] первая.

if (argc < 3) {
  printf("Error: too few arguments.\n");
  return 1;
}

Потенциальная потеря информации

strtol() вернуть long, а не int.

long input1= strtol(argv[1], &inputs, 10);
long input2= strtol(argv[2], &inputs, 10);

Отсутствие и неправильное обнаружение конверсии

char *end1;
char *end2;
long input1= strtol(argv[1], &end1, 10);
long input2= strtol(argv[2], &end2, 10);

if (argv[1] == end1 || argv[2] == end2) {
  printf("Error: no conversion.");
  return 1;
}

Отсутствие подтверждения успеха

Чтобы отличить успех от неопределенного поведения, напечатайте успех.

  // add
  printf("Success\n");
  return 0;
}
0 голосов
/ 09 ноября 2018

Я не уверен, какова цель inputs (если только не проверять ошибки ввода, как указано @yano).Примите во внимание следующее:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char * argv[])
{
    int input1, input2;

    /* Check For Error */
    if(argc != 3)
    {
        printf("Need Two!\n");
        return 2;
    }

    input1= strtol(argv[1], NULL, 10);
    input2= strtol(argv[2], NULL, 10);

    printf("input1: %d,  input2: %d\n", input1, input2);

    if ((input1 > 1) || (input2 >= 100) || (input1 >= input2))
    {
        if(input1 > 1)
            printf("input1 must be 1 or less!\n");
        if(input2 >= 100)
            printf("input2 must be 99 or less!\n");
        if(input1 >= input2)
            printf("input1 must be less than input2!\n");

        return 1;
    }

    return 0;
}

Ваши требования:

  1. input1 должно быть меньше 2
  2. input2 должно быть меньше100
  3. input1 должно быть меньше input2

Выход

$ gcc main.c -o main.exe; ./main.exe;
Need Two!

$ gcc main.c -o main.exe; ./main.exe -8 11;

$ gcc main.c -o main.exe; ./main.exe 13 11;
input1 must be 0 or less!
input1 must be less than input2!

$ gcc main.c -o main.exe; ./main.exe 0 100;
input2 must be 99 or less!

$ gcc main.c -o main.exe; ./main.exe -5 -10;
input1 must be less than input2!
0 голосов
/ 09 ноября 2018

Вы проверяете количество аргументов ( argc ) после использования вектора аргумента ( argv ) ...

Ну, Вы можете сделать что-то вроде этого:

#include <stdio.h> // For printing output...
#include <stdlib.h> // For strtol()...

// Customized macro that prints errors...
#define ERROR(ERR) {\
    fprintf(stderr, ERR);\
    return 1;\
    }

int main(int const argc, char * argv[])
{
    char *inputs, *inputs2;
    if (argc == 3)
    {
        int const input1 = strtol(argv[1], &inputs, 10);
        int const input2 = strtol(argv[2], &inputs2, 10);
        if ((*inputs | *inputs2) != '\0' || input1 > 1 || input2 >= 100 || input1 >= input2)
            ERROR("You have passed invalid arguments")
    }
    else
        ERROR("You have passed invalid arguments")
    return 0;
}
0 голосов
/ 09 ноября 2018
  1. Перед использованием argv[2] следует убедиться argc >= 3
  2. Строка return 1} должна быть return 1;}

Может работать следующее code:

#include<stdio.h>

int main(int argc, char * argv[]) {
    if (argc < 3) {
        perror("Error");
        return 1;
    } 

    char *inputs1;
    char *inputs2;

    int input1= strtol(argv[1], &inputs1, 10);
    int input2= strtol(argv[2], &inputs2, 10);

    if (*inputs1!='\0' || *inputs2 != '\0' || input1 > 1 || input2 >= 100 || input1 >= input2) {
        printf("Error.");
        return 1;
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...