开关盒不影响变量C

时间:2018-12-11 15:23:37

标签: c switch-statement

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;并没有做应做的事,但我不知道为什么。

2 个答案:

答案 0 :(得分:1)

您需要告诉getopt()有关需要参数的选项。如@xing在注释中所述,您可以通过在受影响的选项字母后面的选项字符串中加一个冒号来实现。这允许getopt()正确处理分组的选项并识别非选项参数。只有这样做,您才能期望通过optarg传递选项参数。

您声称在注释中需要一个可选的选项参数。 POSIX标准的getopt()并未提供此功能。在您的特定情况下,您不清楚为什么还要使用它,因为指定不带参数的-t选项意味着什么?该程序应使用默认值吗?但这就是如果完全省略-t的情况。

尽管如此,使用POSIX getopt()处理这种情况的方法是提供两个单独的选项,一个带有参数,而另一个不带参数。例如,您可能使用选项-T来表示您想要的任何内容-t,而没有选项表示(getopt(argc, argv, "t:Th"))。另外,如果您愿意依赖GNU扩展,则可以通过双冒号(getopt(argc, argv, "t::h"))表示一个可选的option参数,但这可移植性较低,并且语义稍有不同。

答案 1 :(得分:0)

一段时间后,您可以使用optind来查看是否还有另一个参数,如果有,请使用该参数代替默认参数。

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

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
                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;
        }
    }
    if ( optind < argc) {//more arguments available
        //Set arg to given arg
        argtime = argv[optind];
    }

    printf("The set time is %s\n", argtime);
    return 0;
}