【问题标题】:getopt switch statement never hitting default casegetopt switch 语句永远不会遇到默认情况
【发布时间】:2014-08-14 03:32:29
【问题描述】:

我已尝试搜索,但没有找到重复/类似的问题。

为什么在这种情况下“默认”永远不会触发?为秋季准备的课程做一些以前的家庭作业,我遇到了 C 语言中的 getopt() 问题。

以下是有问题的特定行:

while ((c = getopt(argc, argv, "i:o:")) != -1) {
        switch (c) {
            case 'i':
            inFile = strdup(optarg);
            break;

            case 'o':
            outFile = strdup(optarg);
            break;

            default:
            usage(); //this prints the "usage" statement and exits cleanly.
        }
    }

我的问题是,怎么来电话

./fastsort a b c d

不打印使用情况并退出?

【问题讨论】:

    标签: c command-line-arguments getopt


    【解决方案1】:

    我想通了,感觉自己像个白痴:

    由于从来没有给出任何有效的参数/标志,while 循环甚至不会执行。我只是事先添加了一点检查,它似乎可以解决问题:

    //Check number of args
    if(argc < 5 || getopt(argc, argv, "i:o:") == -1){
        usage();
    }
    

    编辑:刚刚意识到它还没有完全起作用。现在,由于我过早地调用 getopt 一次,它会过早地转储其中一个参数,因此无法正确设置正确的参数。

    我的新“解决方案”(虽然有点老套)是:

    -Initialize inFile and outFile to null
    -Do the while loop as in my original post
    -If inFile or outFile are still null, print usage
    

    它通过了所有给定的自动化测试。

    【讨论】:

    • 我会考虑argc &lt; 5,这样如果您以后有其他选项或更多输入,您的支票仍然有效,但不会自动将您扔到usage()
    【解决方案2】:

    下面的代码将搜索-i hello或/和-o world等选项

    while((c = getopt(argc, argv, "i:o:") != -1)
    

    但是你正在执行的是:

    ./fastsort a b c d
    

    不满足 getopt(argc, argv, "i:o:") != -1 的位置,因为传递的参数 a b c d 都不是选项

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多