c - 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
解决方案
将其放在这里以备后用,但getopt
期望 的第一个值argv
是程序名称,并在不解析值的情况下对其进行修剪。这意味着如果您argv
自己生成值,则需要在前面加上一个虚拟程序名称。
推荐阅读
- maven-assembly-plugin - maven-assembly-plugin 使用非配置存储库解决依赖关系
- python-3.x - Opencv - ModuleNotFoundError:没有名为“cv2”的模块 - MacOS
- javascript - 使用 laravel 资产的图像未在 html 中显示
- delphi - 快速报告 - 使用复选框隐藏或显示报告上的备忘录
- html - 是否有可以区分Android应用左右滑动和区域水平滚动的css属性?
- r - 在 R 中,如何使用第二个元数据文件将标签值分解并添加到特定的 data.table 列?
- python - AttributeError:模块“pages.views”没有属性“home_view”
- r - 在r中动态重绘绘图
- javascript - 如何通过get.ElementByTag()修改所有同类型元素
- powershell - 通过 powershell 启用基本身份验证的功能