在C中使用getopt()和switch语句

时间:2015-03-04 19:41:35

标签: c switch-statement arguments getopt

我是C的新手并尝试将getopt与switch语句结合使用。我认为我的问题只是一个语法,但我似乎无法弄明白。我需要像这样运行我的程序: $/webserver -p 8080 -r /my/root/dir。 所以我需要识别-p并获取8080并识别-r并获取/ my / root / dir。目前我的代码找到-p然后找到-r然后检测一个未知选项并退出。这是代码。我在那里有puts()进行测试。

   #define USAGE_STRING "Usage: webserver -p <port> -r  <rootdir>\n"
char *port;
char *rootdir;
// Process command line arguments. Uses GNU getopt() function.
void processargs(int argc, char **argv) {
  int next_option;
  do {
    next_option = getopt(argc, argv, "pr:");
    if (next_option != -1) {
      switch (next_option)
      {
        case 'p': /* -p -- port option  */
          puts("p");

          port = optarg;
         printf("%s", port);
        case 'r': // -r -- root directory option
          puts("r");
          rootdir = optarg;  
        printf("%s", rootdir);
        default:
             puts("unknown");
          /* Unknown option detected. Print it to standard
                output, and exit with exit code zero (normal termination). */
          fprintf(stderr, USAGE_STRING);
          exit(1);

      }
    }
  } while (next_option != -1);
  printf("%s", port);

  if (port == NULL) {

          fprintf(stderr, USAGE_STRING);
          exit(1);
    }
  if (rootdir == NULL) {
  puts("unknown");
          fprintf(stderr, USAGE_STRING);
          exit(1);
    }


}

目前,当我运行上面的命令时,我得到了这个输出(使用puts进行测试)。

p
r
unknown
Usage: webserver -p <port> -r  <rootdir>

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

我相信你想在每个案例结束时使用break,否则执行将进入下一个案例块。

答案 1 :(得分:1)

C switch语句在每种情况结束时需要break,否则执行以下情况中的代码。所以这个:

switch (next_option)
{
case 'p':                      /* -p -- port option */
    puts("p");

    port = optarg;
    printf("%s", port);
case 'r':                      // -r -- root directory option
    puts("r");
    rootdir = optarg;
    printf("%s", rootdir);
default:
    puts("unknown");
    /* Unknown option detected. Print it to standard output, and exit with exit code zero
       (normal termination). */
    fprintf(stderr, USAGE_STRING);
    exit(1);
}

必须更改为:

switch (next_option)
{
case 'p':                      /* -p -- port option */
    puts("p");

    port = optarg;
    printf("%s", port);
    break;
case 'r':                      // -r -- root directory option
    puts("r");
    rootdir = optarg;
    printf("%s", rootdir);
    break;
default:
    puts("unknown");
    /* Unknown option detected. Print it to standard output, and exit with exit code zero
       (normal termination). */
    fprintf(stderr, USAGE_STRING);
    exit(1);
}

答案 2 :(得分:0)

首先,您应该使用getopt_long()我认为getopt()已弃用。您在switch语句中也缺少break。如果在每个案例下面都会被执行。虽然你可以使用do-while循环,但使用while循环更简单。

这是一个可以构建的简单命令行解析器。

static const char *optstring = "p:r:";

static struct option longopts[] =
{
    { "port", required_argument, NULL, 'p' },
    { "root", required_argument, NULL, 'r' },
    { NULL, 0, NULL, 0 }
};

int parseInput(int argc, char * const argv[])
{
    int ch;

    /* Main Loop ie the Parser */
    while ((ch = getopt_long(argc, argv, optstring, longopts, NULL)) != -1)
    {
        switch(ch)
        {
            case 'p':
                printf("arg: %s\n", optarg);
                break;

            case 'r':
                printf("arg: %s\n", optarg);
                break;

            default:
                printf("Unsupported option\n");
                return -1;
        }
   }
   return 0;
}