C getopt()函数-optin未按预期递增/运行

C getopt()函数-optin未按预期递增/运行,c,command-line,C,Command Line,根据我向该程序传递选项的格式,变量optind将正确递增以反映下一个选项值,或者不递增 如果我使用/cfind-aru,我会得到以下(奇怪的)输出 请注意,optind不会从aflag增加到rflag,而是从rflag增加到uflag 但是,当我使用格式./cfind-a-r-u时,我会得到以下(预期的)输出 这是我想要的输出 我的这个函数代码如下 #include "cfind.h" #define OPTLIST "acdirstu" // list of valid options vo

根据我向该程序传递选项的格式,变量
optind
将正确递增以反映下一个选项值,或者不递增

如果我使用
/cfind-aru
,我会得到以下(奇怪的)输出

请注意,optind不会从aflag增加到rflag,而是从rflag增加到uflag

但是,当我使用格式./cfind-a-r-u时,我会得到以下(预期的)输出

这是我想要的输出

我的这个函数代码如下

#include "cfind.h"
#define OPTLIST "acdirstu" // list of valid options

void ProcOpt(int argc, char *argv[]) {
    int opt = 0; // default value
    opterr = 0; // prevent getopt from passing error message to stderr buffer
    // char *filenm = NULL; // pointer to the path name
    while((opt = getopt(argc, argv, OPTLIST)) != -1) {
        switch (opt) {
            case 'a':
                fprintf(stdout, "optind: %i\n", optind);
                aflag = true;
                assert(aflag == true);
                fprintf(stdout, "aflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;      
            case 'c':
                fprintf(stdout, "optind: %i\n", optind);
                cflag = true;
                assert(cflag == true);
                fprintf(stdout, "cflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;      
            case 'd':
                fprintf(stdout, "optind: %i\n", optind);
                dflag = true;
                assert(cflag == true);
                fprintf(stdout, "dflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;      
            case 'i':
                fprintf(stdout, "optind: %i\n", optind);
                iflag = true;
                assert(iflag == true);
                fprintf(stdout, "iflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;      
            case 'r':
                fprintf(stdout, "optind: %i\n", optind);
                rflag = true;
                assert(rflag == true);
                fprintf(stdout, "rflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;      
            case 's':
                fprintf(stdout, "optind: %i\n", optind);
                sflag = true;
                assert(sflag == true);
                fprintf(stdout, "sflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;      
            case 't':
                fprintf(stdout, "optind: %i\n", optind);
                tflag = true;
                assert(tflag == true);
                fprintf(stdout, "tflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;      
            case 'u':
                fprintf(stdout, "optind: %i\n", optind);
                uflag = true;
                assert(uflag == true);
                fprintf(stdout, "uflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);        
            break;
            default:
                usage();
        }   
    }   
}
我做错什么了吗?关于
getopt()
以及它如何增加
optind
,我有什么误解吗

谢谢。

手册页上写着(我的重点):

变量optind是argv中要处理的下一个元素的索引

您的调用选项
-aru
都作为单个字符串包含在
argv[1]

手册页上(强调我的):

变量optind是argv中要处理的下一个元素的索引


您的调用选项
-aru
都作为单个字符串包含在
argv[1]

中,我觉得输出是正确的

optind
是要处理的下一个参数的索引。当所有选项都在一起时,它们都在
argv[1]
中,因此
optin
在处理
u
选项之前保持为1。此时,由于
argv[1]
中的所有内容都已被使用,
optind
被设置为2

当所有选项都位于
argv
的单独元素中时,
optind
始终是要处理的下一个参数的索引


请参阅。

我认为输出是正确的

optind
是要处理的下一个参数的索引。当所有选项都在一起时,它们都在
argv[1]
中,因此
optin
在处理
u
选项之前保持为1。此时,由于
argv[1]
中的所有内容都已被使用,
optind
被设置为2

当所有选项都位于
argv
的单独元素中时,
optind
始终是要处理的下一个参数的索引


请参阅。

将此项放在程序的开头,以查看正在进行的操作:

for (int i = 0; i < argc; ++i)
     printf("Param %d: %s\n", i, argv[i]);
for(int i=0;i
将此项放在程序的开头,以查看发生了什么:

for (int i = 0; i < argc; ++i)
     printf("Param %d: %s\n", i, argv[i]);
for(int i=0;i
#包括#包括
外部字符*optarg;
外部-内部选项;
int main(int argc,字符**argv){
INTC;
printf(“-----------选项:------------\n”);
而((c=getopt(argc,argv,abcd:)!=-1){
printf(“opt:%c arg%s\n”,(char)c,optarg);
}
argc-=optind-1;
argv+=optind-1;
printf(“----剩余参数:-----\n”);
对于(int i=1;i
#包括#包括
外部字符*optarg;
外部-内部选项;
int main(int argc,字符**argv){
INTC;
printf(“-----------选项:------------\n”);
而((c=getopt(argc,argv,abcd:)!=-1){
printf(“opt:%c arg%s\n”,(char)c,optarg);
}
argc-=optind-1;
argv+=optind-1;
printf(“----剩余参数:-----\n”);
对于(int i=1;i
for (int i = 0; i < argc; ++i)
     printf("Param %d: %s\n", i, argv[i]);
#include <stdio.h> #include <unistd.h>
      extern char *optarg;
      extern int optind;
      int main (int argc, char** argv) {
        int c;
      printf("--------- options: ---------\n");
      while ((c = getopt (argc,argv,"abcd:")) != -1) {
          printf("opt: %c arg %s\n", (char)c, optarg);
      }
      argc -= optind - 1;
      argv += optind - 1; 
      printf("------ remaining args: ------\n");
      for (int i = 1; i < argc; i++) {
      printf("argv[%d] = %s\n", i, argv[i]); 
     } 
    }