【问题标题】:getopt in C always returns a 1 or '\001' for every argumentC 中的 getopt 总是为每个参数返回一个 1 或 '\001'
【发布时间】:2016-06-18 00:50:53
【问题描述】:

我试图在我的代码中使用 C 中的函数 getopt(),但它总是返回 1。

我完全不知道发生了什么。 最后,我将代码缩短为这样的测试:

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

int main(int argc, char** argv) {
    int ch;
    while (ch = getopt(argc, argv, "s:E:") != -1) {
        printf(" %d\n", ch);
    }
}

然后我用./test -s 0 -E 1 运行它,我得到了两个 1。 我想我应该为 E 或 s 获得至少 69 分?

这是我如何编译、运行它以及如何使用 gdb 将命令行传递给它的屏幕截图。

起初,我使用 'char ch' 而不是 'int ch'。到时候我会从getopt中得到ch = '/001'。

编辑

它现在可以工作了,它需要括号。 谢谢大家!

【问题讨论】:

  • @ColonelThirtyTwo 调用它!我百分百确定。赋值操作的优先级低于关系操作。 C确实有太多的优先级,但它们至少是相当合理的。
  • 当一些答案对你有帮助时,accept it。不要修改问题说它已经解决了。除非真的有必要,否则不要在这里使用图像。只需复制文本并粘贴到此处即可
  • 欢迎来到 Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受对你提出的任何问题最有帮助的答案(这也给出了你的声誉小幅提升)。请参阅About 页面以及How do I ask questions here?What do I do when someone answers my question?

标签: c getopt


【解决方案1】:
ch = something != -1

is equivalent to

ch = (something != -1)

因此,您实际上并没有在ch 中得到getopt 调用的结果,而是比较的结果(在执行循环体get 时为真,因此1)。

要解决此问题,请添加一对额外的括号:

while ((ch = getopt(argc, argvm "s:E:")) != -1) {
    printf(" %d\n", ch);
}

【讨论】:

    【解决方案2】:
    while (ch = getopt(argc, argv, "s:E:") != -1)
    

    被解析为:

    while (ch = (getopt(argc, argv, "s:E:") != -1))
    

    即比较getopt的结果并将比较结果(1或0)存储在ch中。

    使用括号覆盖运算顺序:

    while ((ch = getopt(argc, argv, "s:E:")) != -1)
    

    【讨论】:

      猜你喜欢
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 2021-12-18
      • 2019-04-27
      相关资源
      最近更新 更多