2016-07-01 5 views
0

Я пишу код, взятый из командной строки. Пользователь будет вводить в командной строке, например, ./a.out -l 2 4 6. Цель здесь состоит в том, чтобы перебрать массив и посмотреть, появляются ли либо '-l', либо '-s'. Если «-l'» появляется, то он принимает значение x = 1, если '-s' x = 2, если ни x = 0. В настоящий момент проблема заключается в сравнении между указателем и целым числом в строке 7 и 12. Также многосимвольная символьная константа в строке 12, что я не уверен, почему его бросают, когда линия 9 в порядке. Как я могу изменить свои операторы if, чтобы исправить возникающие проблемы? Мой код выглядит следующим образом:C пользовательский ввод в массив, используемый как оператор

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

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

    int x; 

    for(; *argv != '\0'; argv++){ 
    if(*argv == '-l'){ 
     x = 1; 
    } 
    else if(*argv == '-s'){ 
     x = 2; 
    } 
    else{ 
    x = 0; 
    } 
} 
    printf("%d",x); 
    return 0; 
} 
+2

Возможный дубликат [Как сравнить указатель на строки в C] (http://stackoverflow.com/questions/ 3663668/how-to-compare-pointer-to-strings-in-c) –

+0

Тот же ответ немного другой вопрос, я не сравниваю две строки, но ищет символ из строкового ввода, который теперь находится в массиве –

+1

Да, вы пытаясь сравнить две строки ... Если нет, зачем вы писали '* argv == '-s''? –

ответ

2

Строки указаны с двойными кавычками, а не одинарные кавычки, которые используются для символов. Кроме того, вы не можете использовать == для сравнения строк. Используйте strcmp для этого:

if(strcmp(*argv,"-l") == 0){ 

... 

if(strcmp(*argv,"-s") == 0){ 

Ваш выход также не будет, как вы ожидаете. Вы переписываете x каждый раз, когда вы проверяете следующий параметр, поэтому результат будет зависеть только от последнего. Вы должны выполнить break, если выполнено одно из двух условий.

+0

Мой вывод x = 0, что неверно, когда я делаю './a.out -l 2 4 6' любые идеи? –

+0

@ user6534541 См. Мое редактирование. – dbush

0

Помимо ошибок, отмеченных другими, вы можете в какой-то момент захотеть провести правильный синтаксический анализ командной строки. В системе POSIX это делается с помощью функции библиотеки getopt(), объявленной в заголовке unistd.h (это не «C-код» C-кода).

я расширил свои требования с опцией -x, который принимает целочисленный аргумент, который говорит, что x должен быть установлен:

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

int main(int argc, char **argv) 
{ 
    int x = 0; /* default zero for x */ 
    int i, tmp; 
    int opt; 

    char *endptr; 

    /* the ':' in the string means "the previous letter takes an argument" */ 
    while ((opt = getopt(argc, argv, "lsx:")) != -1) { 
     switch (opt) { 
     case 'l': 
      x = 1; 
      break; 
     case 's': 
      x = 2; 
      break; 
     case 'x': 
      /* validate input, must be integer */ 
      tmp = (int)strtol(optarg, &endptr, 10); 
      if (*optarg == '\0' || *endptr != '\0') 
       printf("Illegal value for x: '%s'\n", optarg); 
      else 
       x = tmp; 
      break; 
     case '?': /* fallthrough */ 
     default: 
      /* call routine that outputs usage info here */ 
      puts("Expected -s, -l or -x N"); 
     } 
    } 

    argc -= optind; /* adjust */ 
    argv += optind; /* adjust */ 

    printf("x = %d\n", x); 

    puts("Other things on the command line:"); 
    for (i = 0; i < argc; ++i) 
     printf("\t%s\n", argv[i]); 

    return EXIT_SUCCESS; 
} 

Забегая:

$ ./a.out -l 
x = 1 
Other things on the command line: 

$ ./a.out -s 
x = 2 
Other things on the command line: 

Последняя опция «победы ":

$ ./a.out -s -x -78 
x = -78 
Other things on the command line: 

Здесь -s последняя:

$ ./a.out -s -x -78 -ls 
x = 2 
Other things on the command line: 

$ ./a.out -s -q 
./a.out: illegal option -- q 
Expected -s, -l or -x N 
x = 2 
Other things on the command line: 

Синтаксический останавливается на первой не-опции:

$ ./a.out -s "hello world" 8 9 -x 90 
x = 2 
Other things on the command line: 
    hello world 
    8 
    9 
    -x 
    90