2015-07-28 8 views
1

У меня есть нижняя часть кода, в которой я заметил, что если я изменю 0 на 1, результат будет таким же. Я получаю STACKprint(); с «on» в качестве второго аргумента, ничего с чем-либо еще, и если нет аргумента, я получаю ошибку сегментации. Я предполагаю, что для ошибки сегментации мне нужно проверить, является ли аргумент NULL, но я не уверен, как это сделать со вторым параметром, и это действительно меня пугает, почему (strcmp (argv[2],"on") == 1) не имеет никакого эффекта. Не предполагается ли значение TRUE?Проверка аргумента командной строки C

if (strcmp (argv[2],"on") == 0) { 
      STACKprint(); 
      printf("\n"); 
} 
+6

Для предотвращения ошибки сегментации вам необходимо проверить 'argc'. – aschepler

+2

Вы должны использовать 'argc' (число), чтобы определить, существует ли' argv [2] '. – donjuedo

+1

@aschepler Извините за глупый вопрос, но что такое 'STACKprint()'? – ameyCU

ответ

1

Прежде всего, чтобы проверить, есть ли аргумент, вы должны использовать переменную argc для main(int argc, char** argv), которая указывает длину вашего массива argv.

if (argc < 3) { 
    printf("missing argument\n"); 
    exit(-1); 
} 

Что касается strcmp, страница только человек заявляет, что он возвращает 0, если две строки в аргументе равны, иначе ненулевая ... но не обязательно 1. На самом деле это зависит от реализации. Таким образом, способ использовать его для проверки равенства строк:

if (0 == strcmp(argv[2], "on")) { 
    // do something 
} else { 
    // do something else 
} 
+0

Вы имеете в виду 'argc <3', так как он использует' argv [2] ', правильно? – Jay

+0

Вы правы, я отредактировал свой ответ –

4

Чтобы избежать Segfault, проверьте значение argc, чтобы обнаружить, существует ли argv[2]. Если argc < 3, argv[2] не был предоставлен.

strcmp() не возвращает true/false; он возвращает значение, меньшее, равное или большее нуля, в зависимости от относительных значений его аргументов.

1

Если программа что-то вроде этого

#include <stdio.h> 


    int main (int argc, char**argv) 
    { 
    if (argc >= 3 && strcmp (argv[2],"on") == 1){ 
    //  STACKprint(); 
      printf("\n"); 
     } 
    } 

и вы пытаетесь запустить его с myexe 1 on, он никогда не будет идти в если блок и если вы измените 1 до 0, он будет идти.

Что-то еще не так.

Будет хорошо, если вы сможете опубликовать свой код и способ его вызова.

+0

Уверен, что вы хотите 'strcmp (argv [2]," on ") == 1' вместо' strcmp (argv [2], "on") == 0' или 'strcmp (argv [2]," on ")! = 0'? – chux