在C中使用getopt的问题

时间:2014-01-02 17:46:48

标签: c getopt

我想使用getopt()来解析命令行提供的参数,但是我遇到了非常简单的测试用例的问题。我有以下代码(几乎,但不完全相同,作为POSIX standard definition中的示例提供的代码。)

int main(int argc, char *argv[]) {
    int c;
    int rmsflg = 0, saflg = 0, errflg = 0;
    char *ifile;
    char *ofile;

    //Parse command line arguments using getopt
    while (((c=getopt(argc,argv, ":i:rso:")) != 1) && (errflg == 0))  {
        switch(c){
            case 'i':
                ifile="optarg";
                break;
            case 'o':
                ofile="optarg";
                break;
            case 'r':
                if (saflg)
                    errflg++;
                else {
                    rmsflg++;
                    printf("Root Mean Square averaging selected\n");
                }
                break;
            case 's':
                if (rmsflg)
                    errflg++;
                else {
                    saflg++;
                    printf("Standard Arithmetic averaging selected\n");
                }
                break;
            case ':':
                fprintf(stderr,"Option -%c requires an argument\n",optopt);
                errflg++;
                break;
            case '?':
                fprintf(stderr,"Option -%c is not a valid option\n",optopt);
                errflg++;
                break;
            default:
                fprintf(stderr,"The value of c is %c,\
                        the option that caused this error is -%c\n",c,optopt);
                errflg++;
                break;  
        }
    }
    if (errflg) {
        fprintf(stderr, "usage: xxx\n");
        exit(2);
    }
    return 0;
}

首先,当我没有默认情况时,不会输出任何内容。当我插入默认大小写并使其输出c具有的值时,我得到?。由于两个原因,这很奇怪。首先,这就是最困扰我的原因,为什么c不会匹配专门为匹配此输出而编写的?案例,而是直接转到default案例。其次,optopt的输出是(对于我的输入)o。仅当提供的选项与 optstring 中的任何字符都不匹配时,才会返回?字符。

1 个答案:

答案 0 :(得分:5)

while循环条件中,您应该检查getopt的返回值,而不是1.然后,如果在命令行上传递选项-?,则应该识别它。