Getopt()错误检查

时间:2017-12-06 02:28:12

标签: c error-handling getopt

我试图使它成为getopt可以处理某些标志,但我无法使用getopt实现错误处理。我想防止重复的标记,例如' -s 1 -s 1',并且有太多的参数用于标记' -s 1 2'这两个都应该退出程序。

 int opt; //command flags
 while((opt = getopt(argc, argv, "s:f:")) != -1){
 switch(opt){
  case 's':
    printf("%s\n", optarg);
    printf("%i\n", optind);
    break;
  case 'f':
    printf("%s\n", optarg);
    printf("%i\n", optind);
    break;
  default:
    //unknown command flags
    fprintf(stderr, "Usage:  fred [ -s symbol-table-file ] [ -f fred-program-file ]\n");
    return EXIT_FAILURE;
  }
}

参数太多(例如,程序-s f1 -f f2 hello)。重复标志(例如,程序-s f1 -s f2)。两者都应退出该计划

1 个答案:

答案 0 :(得分:0)

对于每个选项,您可以保留一个标志以查看是否已经遇到该选项。借助这些标志检测到重复的选项。

int c, sflag=0, fflag=0;
while( (c=getopt(argc, argv, "s:f:"))!=-1 )
{
    switch(c)
    {
    case 's':
        if(sflag!=0)
        {
            //fprintf(stderr, "\n dup s option");
            return 1; //duplicate s option
        }   
        sflag++;
        //printf("\ns flag: %s", optarg);
        break;
    case 'f':
        if(fflag!=0)
        {
            //fprintf(stderr, "\n dup f option");
            return 1; //duplicate f option
        }   
        fflag++;
        //printf("\nf flag: %s", optarg);
        break;
    case '?':
        if(isprint(optopt))
        {
            fprintf(stderr, "Unknown option %c", optopt);
        }
        else
        {
            fprintf(stderr, "\nUnknown option character x%x", optopt);
        }
        return 1;
    }
}   

optind将包含下一个argv[]的索引,但仍有待检查。在完成所有选项之后,在您的程序中应该只有一个非选项参数。

因此,optind必须等于argc-1才能正确使用该命令。

if(optind != argc-1) //exactly one non-option argument is expected
{
    fprintf(stderr, "\nInvalid number of arguments.");
    return 1;
}