首页 > 解决方案 > 开关盒不影响变量 C

问题描述

int main (int argc, char **argv) {
    //Initialise variable for switch option
    int option = 0;
    //Set time to default to epoch
    char *argtime = "1970-01-01 00:00:00";
    //Use getopt to parse switches t and h (neither requires an argument, as epoch is defaulted to if non is supplied)
    while ((option = getopt(argc, argv, "th")) != -1) {
        //Switch statements for supplied switches
        switch (option) {
            //If -t
            case 't':
                //If arg supplied
                if(optarg != NULL) {
                    //Set arg to given arg 
                    argtime = optarg;
                }
                printf("-t is selected.\n");
                break;
            //If -h
            case 'h':
                printf("Help is selected\n");
                break;
            //If anything else
            default:
                printf("Option invalid\n");
                return 1;
        }
    }
    printf("The set time is %s\n", argtime);
    return 0;
}

这是我编写的一些代码,用于使用 getopt() 来解析命令行开关和参数。如果没有提供参数,我希望它argtime默认为“1970-01-01 00:00:00”,但当我使用-t开关并提供不同的参数时,argtime 不受影响。所以基本上argtime = optarg;没有做它应该做的,但我不知道为什么。

标签: cswitch-statement

解决方案


您需要getopt()说明需要参数的选项。正如@xing 在评论中所描述的那样,您可以通过在选项字符串中,在受影响的选项字母之后放置一个冒号来做到这一点。这允许getopt()正确处理分组选项并识别非选项参数。只有这样做,您才能期望通过optarg.

您在评论中声称想要一个可选的选项参数。POSIX 标准getopt()没有提供这一点。在您的特定情况下,尚不清楚您为什么甚至想要它,因为指定-t没有参数的选项意味着什么?那程序应该使用默认值吗?但这就是如果-t完全省略它会做的事情。

尽管如此,使用 POSIX 处理这种情况的方法getopt()是提供两个单独的选项,一个带参数,一个不带参数。例如,您可以使用 option-T来表示您想要的任何内容,-t而无需使用表示 ( getopt(argc, argv, "t:Th")) 的选项。或者,如果您愿意依赖 GNU 扩展,那么您可以通过双冒号 ( getopt(argc, argv, "t::h")) 表示可选的选项参数,但这不太便携,并且语义略有不同。


推荐阅读