путаница с функцией getopt в c - PullRequest
0 голосов
/ 06 апреля 2020

Я написал код с функцией getopt, который следует:

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

int main(int argc, char *argv[]){
    int result;
    opterr=0;
    puts("The following parsed outcome to command-line argments by getopt(-a, -b* or -c*):");
    while((result=getopt(argc, argv, "ab:c::"))!=-1){
        switch(result){
        case ':':
            printf("getopt returns \'%c\'\toptopt=%c\toptarg=%s\toptind=%d\t", result, optopt, optarg, optind);
            break;
        case '?':
            if(optopt=='b')
                fprintf(stderr, "Option -%c requires an argument attached. optarg=%s\toptind=%d\t", optopt, optarg, optind);
            else if(isprint(optopt))
                fprintf(stderr, "Unknown option \'%c\'.\toptarg=%s\toptind=%d\t", optopt, optarg, optind);
            else
                fprintf(stderr, "Unknown option character \'%x\'.\toptarg=%s\toptind=%d\t", optopt, optarg, optind);
            break;
        default:
            printf("getopt returns \'%c\'\toptarg=%s\toptind=%d\t", result, optarg, optind);
            break;
        }
        printf("argv[%d]=%s\n", optind, argv[optind]);}

    puts("Here is parsed argument values:");
    for(result=1; result<argc; result++)
        printf("argv[%d]=%s\n", result, argv[result]);
    for(; optind<argc; optind++)
        printf("No-option argument values: argv[%d]=%s\n", optind, argv[optind]);
    return 0;
}

, затем я скомпилировал вышеупомянутую программу в исполняемый файл с именем parse. Запустите parse со следующим аргументом командной строки:

./parse -ac b

здесь выводится:

  The following parsed outcome to command-line argments by getopt:
  getopt returns 'a'      optarg=(null)   optind=1        argv[1]=-ac
  getopt returns 'c'      optarg=(null)   optind=2        argv[2]=b
  Here is parsed argument values:
  argv[1]=-ac
  argv[2]=b
  No-option argument values: argv[2]=b

моя путаница заключается в том, почему getopt может вернуть c при обнаружении c в argv[1] ac. потому что это не было -c. в моем ожидании, это должно выполнить оператор case '?':

1 Ответ

2 голосов
/ 06 апреля 2020

Когда вы используете getopt, односимвольные параметры без аргументов можно комбинировать со следующей опцией. Вот что позволяет набирать

ls -lR

. Это работает, даже если следующий параметр принимает аргумент.

...