web-dev-qa-db-ja.com

Getopt-引数に文字列パラメーターを渡す

複数のコマンドライン引数を受け取るプログラムがあるので、getoptを使用しています。私の引数の1つは、パラメーターとして文字列を受け取ります。とにかくgetopt関数を介してその文字列を取得する必要がありますか、それともargv []配列を介して取得する必要がありますか? getoptは-fileのような引数を読み込むこともできますか?これまで見てきたすべての引数には、-aなどの1文字しかありません

[〜#〜] edit [〜#〜]

以下の回答から、getopt_long()を使用するプログラムを作成しましたが、switch引数は長い引数ではなく文字引数を使用した場合にのみ引数を認識します。なぜこれが起こるのかわかりません。引数を渡すときに-mf -file sampleのprintステートメントが表示されません。

[〜#〜] edit [〜#〜]

コマンドの引数を--fileとして入力してみたところ、うまくいきました。 -fileだけでこれを行うことはできませんか?

static struct option long_options[] =
{
    {"mf", required_argument, NULL, 'a'},
    {"md", required_argument, NULL, 'b'},
    {"mn", required_argument, NULL, 'c'},
    {"mw", required_argument, NULL, 'd'},
    {"lf", required_argument, NULL, 'e'},
    {"ld", required_argument, NULL, 'f'},
    {"ln", required_argument, NULL, 'g'},
    {"lw", required_argument, NULL, 'h'},
    {"rf", required_argument, NULL, 'i'},
    {"rd", required_argument, NULL, 'j'},
    {"rn", required_argument, NULL, 'k'},
    {"rw", required_argument, NULL, 'l'},
    {"df", required_argument, NULL, 'm'},
    {"dd", required_argument, NULL, 'n'},
    {"dn", required_argument, NULL, 'o'},
    {"dw", required_argument, NULL, 'p'},
    {"file", required_argument, NULL, 'q'},
    {NULL, 0, NULL, 0}
};
int ch=0;
while ((ch = getopt_long(argc, argv, "abcdefghijklmnopq:", long_options, NULL)) != -1)
{
    // check to see if a single character or long option came through
        switch (ch){
        case 'a':
            cout<<"title";
            break;
        case 'b':

            break;
        case 'c':

            break;
        case 'd':

            break;
        case 'e':

            break;
        case 'f':

            break;
        case 'g':

            break;
        case 'h':

            break;
        case 'i':

            break;
        case 'j':

            break;
        case 'k':

            break;
        case 'l':

            break;
        case 'm':

            break;
        case 'n':

            break;
        case 'o':

            break;
        case 'p':

            break;
        case 'q':
            cout<<"file";
            break;
        case '?':
            cout<<"wrong message"
            break;  
    }
}
11
AndroidDev93

読んだ man getopthttp://linux.die.net/man/3/getopt

optstringは、正当なオプション文字を含む文字列です。そのような文字の後にコロンが続く場合、オプションには引数が必要であるため、getopt()は、optarg内の同じargv-elementの次のテキスト、または次のargv-elementのテキストへのポインターを配置します。 2つのコロンは、オプションがオプションの引数を取ることを意味します。現在のargv要素にテキストがある場合(つまり、「-oarg」などのオプション名と同じWord内にある場合)、optargに返されます。それ以外の場合、optargはゼロに設定されます。

サンプルコード:

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

int main (int argc, char *argv[])
{
  int opt;
  while ((opt = getopt (argc, argv, "i:o:")) != -1)
  {
    switch (opt)
    {
      case 'i':
                printf ("Input file: \"%s\"\n", optarg);
                break;
      case 'o':
                printf ("Output file: \"%s\"\n", optarg);
                break;
    }
  }
  return 0;
}

ここで、optstringは "i:o:"です。文字列の各文字の後のコロン ':'文字は、これらのオプションに引数が必要であることを示しています。引数はoptargグローバル変数の文字列として見つけることができます。詳細およびその他の例については、マニュアルを参照してください。

複数の文字オプションスイッチについては、長いオプションgetopt_long。例については、マニュアルを確認してください。

[〜#〜] edit [〜#〜]単一の '-'長いオプションに対する応答:

マニュアルページから

getopt_long_only()はgetopt_long()に似ていますが、「-」と「-」は長いオプションを示します。 「-」(「-」ではない)で始まるオプションが長いオプションと一致しないが、短いオプションと一致する場合、代わりに短いオプションとして解析されます。

マニュアルを確認して、試してください。

20
phoxis

フラグに引数が必要であることを指定するには、short_opt変数のフラグの直後に「:」を追加します。長い引数を使用するには、getopt_long()を使用します。

以下に簡単なプログラム例を示します。

#include <getopt.h>
#include <stdio.h>

int main(int argc, char * argv[]);

int main(int argc, char * argv[])
{
   int             c;
   const char    * short_opt = "hf:";
   struct option   long_opt[] =
   {
      {"help",          no_argument,       NULL, 'h'},
      {"file",          required_argument, NULL, 'f'},
      {NULL,            0,                 NULL, 0  }
   };

   while((c = getopt_long(argc, argv, short_opt, long_opt, NULL)) != -1)
   {
      switch(c)
      {
         case -1:       /* no more arguments */
         case 0:        /* long options toggles */
         break;

         case 'f':
         printf("you entered \"%s\"\n", optarg);
         break;

         case 'h':
         printf("Usage: %s [OPTIONS]\n", argv[0]);
         printf("  -f file                   file\n");
         printf("  -h, --help                print this help and exit\n");
         printf("\n");
         return(0);

         case ':':
         case '?':
         fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]);
         return(-2);

         default:
         fprintf(stderr, "%s: invalid option -- %c\n", argv[0], c);
         fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]);
         return(-2);
      };
   };

   return(0);
}
15
David M. Syzdek