#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 */
}