Getopt returns -1 但它有有效数据
Getopt returns -1 yet it has valid data
我是 运行 我在 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 != '[=12=]' && *s != '\n'; s++){
printf("%c\n", *s);
if (*s == ' '){
*s = '[=12=]';
argv[idx++] = p;
printf("%s\n", p);
p = ++s;
if (idx == nargs) return idx; //bail out if we can't fit any more
}
}
*s = '[=12=]';
argv[idx++] = p;
printf("%s\n", p);
p = ++s;
return idx; //equivalent to argc
}
所以 gdb 说一切都处于完美的工作状态:
(gdb) p opt
= -1
(gdb) p argc
= 2
(gdb) p argv
= {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
稍后将其放在这里,但 getopt
期望 argv
的第一个值是程序名称,并在不解析该值的情况下对其进行修整。这意味着如果您自己生成 argv
值,则需要在前面加上虚拟程序名称。
我是 运行 我在 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 != '[=12=]' && *s != '\n'; s++){
printf("%c\n", *s);
if (*s == ' '){
*s = '[=12=]';
argv[idx++] = p;
printf("%s\n", p);
p = ++s;
if (idx == nargs) return idx; //bail out if we can't fit any more
}
}
*s = '[=12=]';
argv[idx++] = p;
printf("%s\n", p);
p = ++s;
return idx; //equivalent to argc
}
所以 gdb 说一切都处于完美的工作状态:
(gdb) p opt
= -1
(gdb) p argc
= 2
(gdb) p argv
= {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
稍后将其放在这里,但 getopt
期望 argv
的第一个值是程序名称,并在不解析该值的情况下对其进行修整。这意味着如果您自己生成 argv
值,则需要在前面加上虚拟程序名称。