2016-02-26 3 views
1

Чтобы запустить мою программу командной строки Unix является «p2 -s input.txt»Makefile командной строки C аргумент

Обычно (без Makefile), чтобы проверить, что флаг == -s я бы мой вход UniX быть - a.out -s input.txt, и моя main.c будет:

int main(int argc, char argv[]) 
{ 
    if(argv[1] == "-s") 
    { 
     printf("The flag is -s\n"); 
    } 
    else 
    { 
     printf("The flag is not -s"); 
    } 
    return 0; 
} 

Теперь, когда я код это с Makefile, я должен изменить, как я проверяю флаг? Или мне нужно изменить параметры main.c? Мой Makefile является:

all: p2 
p2: main.o functions.o 
    gcc -o p2 main.o functions.o 
main.o: main.c 
    gcc -c main.c 
functions.o: functions.c 
    gcc -c functions.c 
clean: 
    rm -f *.o core 
+3

Я думаю, вы должны использовать 'strcmp (argv [1]," -s ") == 0' вместо' argv [1] == "-s" '. – MikeCAT

+0

Ваш вопрос непонятен. Почему makefile влияет на то, как вы пишете код для синтаксического анализа командной строки программы? Файл makefile поможет вам создать программу. Затем вы запускаете программу точно так, как обычно. – kaylum

+0

Спасибо @mikeCAT. Я думал, что попробовал это раньше, и я подумал, что это дало мне ошибку сравнения указателя и целого числа. Спасибо, я ценю помощь! – John

ответ

1

Испытание

if(argv[1] == "-s") 

не работает в C, как это выглядит. C++ часто перегружен для этого работать интуитивно, но то, что C делает:

  1. сравнение равенства значения argv[1] к значению "-s"
  2. Значения первого некоторый адрес в верхней части стеки (одна запись с начала, где находится argv[], которая настроена библиотекой времени выполнения C или операционной системой).
  3. Значение второго является указателем на константу строки.
  4. Адреса не равны, поэтому выражение if оценивается как 0 (ноль).
  5. Значит, else ветка.

Используйте функцию string.h strcmp() для сравнения строк по заданным адресам. В C строка представляет собой последовательность символов, завершенных ascii NUL.

Также обратите внимание, что ваше определение main() имеет недостатки, как указано MikeCAT.

+0

Посмотрите на код внимательно. Второй аргумент - 'char argv []', а не 'char * argv []'. Таким образом, 'argv [1]' не является адресом. – MikeCAT

+0

@MikeCAT: Yikes! Я пропустил это. Я бы ожидал, что большинство компиляторов тоже скажут об этом с подразумеваемым прототипом для 'main()'. – wallyk

1

Да, вы должны изменить то, как вы установите флаг, независимо от того, используете ли вы Makefile, потому что это не стандарт и не имея никаких шансов на успех, как для сравнения строк в C.

вы должны использовать strcmp() для сравнения строк

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

/* correct the type of second argument to the standard one, or strcmp() won't work */ 
int main(int argc, char *argv[]) 
{ 
    if(strcmp(argv[1] "-s") == 0) 
    { 
     printf("The flag is -s\n"); 
    } 
    else 
    { 
     printf("The flag is not -s"); 
    } 
    return 0; 
} 

Altenatively, вы можете сравнить каждые символы вручную, потому что строка флага коротка.

#include <stdio.h> 

/* correct the type of second argument to the standard one, or strcmp() won't work */ 
int main(int argc, char *argv[]) 
{ 
    if(argv[1][0] == '-' && argv[1][1] == 's' && argv[1][2] == '\0') 
    { 
     printf("The flag is -s\n"); 
    } 
    else 
    { 
     printf("The flag is not -s"); 
    } 
    return 0; 
} 
0

Анализ вариантов командной строки является довольно хорошо разрешенной проблемой - вы можете использовать getopt() или libpopt (https://directory.fsf.org/wiki/Popt). @MikeCAT объяснил другие проблемы, с которыми вы столкнулись при сравнении строк.