c - 从 unix 命令行运行时 getopt 无法正常工作

标签 c linux unix command-line-arguments getopt

我编写了(从 Google 复制和粘贴并简化了)一个 C 程序来使用 getopt 打印出从 Unix 命令行传入的参数值。

从 Unix 命令行:

./myprog -a 0 -b 1 -c 2

我的 C 代码是:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    int i;

    while ((i = getopt(argc, argv, "abc")) != -1) {
        switch (i) {
            case 'a': 
               printf("A = %s\n", optarg);
               break;

            case 'b': 
               printf("B = %s\n", optarg);
               break;

            case 'c': 
               printf("C = %s\n", optarg);
               break;

            default:
                break;
        }
    }

    return 0;
}    

我想编程打印出每个传递的值,例如

A = 0
B = 1
C = 2

但是它根本没有打印出任何东西。

最佳答案

你忘记了任何带参数的选项后的“:”。如果你要换一行

while ((i = getopt(argc, argv, "a:b:c:")) != -1) {

您将获得工作变体。

正确阅读man 3 getopt,它说到getopt的第三个参数

… optstring 是包含合法选项字符的字符串。如果这样的字符后跟一个冒号,则该选项需要一个参数,因此 getopt() 将指针指向同一 argv 元素中的以下文本,或指向 optarg 中以下 argv 元素的文本。两个冒号表示一个选项 接受一个可选的参数;如果当前 argv 元素中有文本(即与选项名称本身在同一个词中,例如“-oarg”),则它是 在 optarg 中返回,否则 optarg 设置为零。 ……

关于c - 从 unix 命令行运行时 getopt 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16212218/

相关文章:

c - 为什么 strcat 会产生这个错误?

database - 如果更改目录然后在 linux 中执行一些操作

ruby - 如何在 Ruby 进程中捕获信号

c++ - C/C++ 中是否有与 GNU-R which() 等效的函数?

c - 填充union的内容产生错误

linux - 用户和 crontab 之间的交互

c - 重定向针对 GPU 的消息

Unix 排序字母数字字符与 ':' 、 '/' 组合的键

shell - 有没有办法在关机后自动启动基于 unix 的系统?

c - 在 C 中确定正确的预定义数组大小?