c – 是否可以重复getopt

我正在尝试使用内置命令创建一个基本 shell,我遇到了一些getopt问题.这是输出(使用valgrind):
$mkdir -p foo/bar
mkdir
-p
foo/bar
FLAGON
$mkdir -p foo/test
mkdir
-p
foo/test
==15377== Invalid read of size 1
==15377==    at 0x5201BBE: _getopt_internal_r (in /usr/lib/libc-2.17.so)
==15377==    by 0x5202CEA: _getopt_internal (in /usr/lib/libc-2.17.so)
==15377==    by 0x5202D37: getopt (in /usr/lib/libc-2.17.so)
==15377==    by 0x40351A: shell_ns_cmd_mkdir (shell.c:542)
==15377==    by 0x403AB4: normal_shell_cb (shell.c:610)
==15377==    by 0x402E8E: shell_mainloop (shell.c:402)
==15377==    by 0x401B67: main (main.c:52)
==15377==  Address 0x54e0912 is 2 bytes inside a block of size 3 free'd
==15377==    at 0x4C2AD3C: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==15377==    by 0x402C93: shell_mainloop (shell.c:384)
==15377==    by 0x401B67: main (main.c:52)
==15377== 
$

这是源(剪辑):

for (i = 0; i < argc; i++) {
    puts(argv[i]);
}
while ((c = getopt(argc,argv,"p")) != -1) {
    switch (c) {
        case 'p':
            puts("FLAGON");
            mkparents = true;
            break;
        case '?':
            fprintf(stderr,"invalid option -- %c",optopt);
            ret = 127;
            goto end;
            break;
    }
}

所以它第一次运行它(mkdir -p)识别它(-p),第二次运行它,它没有.有任何想法吗?

解决方法

如果要扫描多个矢量,则需要通过将optind设置为1来重置getopt.

The variable optind is the index of the next element of the argv[]
vector to be processed. It shall be initialized to 1 by the system,
and getopt() shall update it when it finishes with each element of
argv[].

如果将optind设置为1不起作用,也请尝试0,我想我记得在某处阅读过.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...