Не знаю, как проверить входные аргументы в C

#c

#c

Вопрос:

Я хотел бы проверить, что вторым входным аргументом моей программы на C является либо -f, либо -p. Я использую операторы if для проверки этого, и по какой-то причине он не распознает аргумент как строку, но когда я печатаю аргумент, он выглядит идентично. Я пробовал это двумя способами: первый — путем копирования аргумента в массив символов, а второй — путем прямой проверки аргумента. Чего мне не хватает?

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

int main(int argc, char *argv[])
{
    char flag[3] = "";
    memcpy(flag, argv[1],3);
    printf("%sn", flag);

    // check that the second argument is either -f or -p
    if (flag == "-f")
    {
        printf("1");
    }
    else if (argv[1] == "-p")
    {
        printf("2");
    }
    else
    {
        fprintf(stderr, "ERROR: Second argument %s must be <-f> or <-p>n", argv[1]);
        exit(EXIT_FAILURE);
    }
}
    
  

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

1. Вы должны использовать strcmp для сравнения строк.

2. Однако перед использованием вы strcmp должны убедиться, что строковые аргументы должным образом завершаются нулем. В противном strcmp случае это приведет к неопределенному поведению . Поэтому вы можете рассмотреть возможность использования strncpy_s вместо memcpy .

3. @AndreasWenzel Считаете ли вы, что argv[1] когда-нибудь будет больше максимального размера буфера для аргументов? Я не думаю, что в начальной загрузке компилятора / системы для main нет защиты. Я имею в виду, что разумным поведением для компилятора будет обрезать и обнулять аргументы командной строки.

4. @AndreasWenzel И спасибо за редактирование, я покраснел за неправильное образование.

5. Перед доступом argv[1] вы должны убедиться, что argc >= 2 . В противном случае, argv[1] == NULL и ваша программа завершится сбоем.

Ответ №1:

C не C является or Python . == Оператор не работает для сравнения строк. Что делает, это не то, что вы намереваетесь сделать. Вместо этого он сравнивает два указателя.

Для этого вы должны использовать strcmp семейство функций.

 if(strcmp(flag, "-f") == 0){
 /* equals */
}
if(strncmp(flag, "-f", 2) == 0){
 /* equals */
}