首页 > 解决方案 > Getopt 返回 -1 但它有有效数据

问题描述

我在 GDB 中运行我的程序来确定为什么 getopt 返回 -1,我可以看到它显然具有有效数据。我没有从程序的命令行获取 argv/argc,我自己生成它,但它仍然是明显有效的数据。

(相关)代码:

    char* argv[4];                                                                                                                         
    printf("calling create_argv\n");                                                                                                       
    int argc = create_argv(argstring, argv, 4);                                                                                            
    int opt;                                                                                                                               
    int myBuf = 0, total_mbufs = 0;                                                                                                        
    bufs_list* bufToUse = einf->bufs_head;                                                                                                                                                                                                                                        
    while ((opt = getopt(argc, argv, "f:t:")) != -1){                                                                                              
    printf("opt is %s\n", opt);                                                                                                            
    switch(opt){                                                                                                                                   
        case 'f':                                                                                                                                      
        fd = fopen(optarg, "r");                                                                                                               
        break;                                                                                                                         
        case 't':                                                                                                                                      
        fsize = atoi(optarg);                                                                                                                  
        break;                                                                                                                         
        default: break;                                                                                                                
    }                                                                                                                              
}    

create_argv:(根据我对 GDB 的了解)

int create_argv(char* string, char* argv[], int nargs){                                                                                                                                                                                                                                                                                                                                                                                                                                                 
    int idx = 0;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
    char* s;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    char* p;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    printf("in create_argv\n");                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
    for (s = string, p = string; *s != '\0' && *s != '\n'; s++){                                                                                                                                                                                                                                                                                                                                                                                                                                            
        printf("%c\n", *s);                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
        if (*s == ' '){                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
            *s = '\0';                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
            argv[idx++] = p;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
            printf("%s\n", p);                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
            p = ++s;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
            if (idx == nargs) return idx; //bail out if we can't fit any more                                                                                                                                                                                                                                                                                                                                                                                                                       
        }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
    }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
    *s = '\0';                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
    argv[idx++] = p;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    printf("%s\n", p);                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
    p = ++s;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    return idx; //equivalent to argc
}                                                                                                                           

所以 gdb 说一切都处于完美的工作状态:

(gdb) p opt
$2 = -1
(gdb) p argc
$3 = 2
(gdb) p argv
$4 = {0x7a9935 "-f", 0x7a9938 "file.txt", 0x2f76006f666e692f <Add

(argv[2] 无效,但没关系,因为 argc 只有 2)。

那么getopt有什么问题呢?它显然有一个有效的 argc,一个有效的 argv,但它拒绝承认它得到的是有效数据。

编辑:输出显示while循环永远不会运行 -

calling create_argv
in create_argv
-
f

-f 
i
l
e
.
t
x
t
file.txt
no file loaded (did you specify -f filename?). Refusing to load an empty file

标签: cgetopt

解决方案


将其放在这里以备后用,但getopt期望 的第一个值argv是程序名称,并在不解析值的情况下对其进行修剪。这意味着如果您argv自己生成值,则需要在前面加上一个虚拟程序名称。


推荐阅读