命令行和结构的参数

时间:2014-11-11 15:11:45

标签: c struct command-line-arguments

我正在用C编写一个程序,它有几个参数,我可以在运行它时在命令行中输入。例如:

./proj select row 3 <table.txt

打印第3行。

在我的计划中,我有很多if / else。例如,如果argv [1]为select而argv [2]为row,则执行此操作,依此类推。我把它展示给了我的老师,被告知不要用if-else而是用结构来做这件事。而问题是我不知道如何。你能给我一些关于如何开始的简单建议吗?

2 个答案:

答案 0 :(得分:0)

使用getopt处理命令行选项。这是一个例子:

http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html

在你的情况下,我认为如下:

./proj -r 3 <table.txt

会很好。所以在你的getopt while循环中,你要检查'r'参数并存储它的值。然后在代码中使用该值。类似的东西:

int row_num = -1;
while ((c = getopt (argc, argv, "r:")) != -1)
    switch (c)
      {
      case 'r':
        row_num = optarg;
        break;
      case '?':
        if (optopt == 'r')
          fprintf (stderr, "Option -%c requires an argument.\n", optopt);
        else if (isprint (optopt))
          fprintf (stderr, "Unknown option `-%c'.\n", optopt);
        else
          fprintf (stderr,
                   "Unknown option character `\\x%x'.\n",
                   optopt);
        return 1;
      default:
        abort ();
      }
  printf ("row_num = %d\n", row_num);

  /* Now use your row_num variable here. */

  return 0;
}

请注意,您也可以将输入文件的名称作为参数,然后您就不必像现在一样将其输入。类似的东西:

./proj -r 3 -f table.txt

你会在互联网上找到更多关于getopt的例子。

答案 1 :(得分:0)

有几点。

首先,我使用getopt_long()解析命令行。

#include <getopt.h>

int opt = 0;
int opt_index = 0;
static const char sopts[] = "s:";                    /* Short options */
static const struct option lopts[] = {               /* Long options  */
            {"select",   required_argument, NULL, 's'},
            {NULL, 0, NULL, 0}
    };

while ((opt = getopt_long(argc, argv, sopts, lopts, &opt_index)) != -1) {
    /* use a switch/case statement to parse the arguments */
}

其次在使用结构的情况下。我想到了一些事情:

struct opts {
    int num;
    char *select;
}

将行号放入num,将选择变量(在您的情况下为row)放入select数组。

当然,您需要填写代码的其余部分。但这是朝着这个方向发展的一个起点和点。