2013-07-26 17 views
8

Birden çok komut satırı argümanını alan bir programım var, bu yüzden getopt kullanıyorum. Benim argümanlarımdan biri string olarak bir parametre alır. Yine de bu dizeyi getopt işleviyle elde etmek için var mı yoksa argv [] dizisiyle elde etmek zorunda mıyım? Ayrıca -file gibi okuyucular okunabilir? Bugüne dek gördüğüm tüm argümanlar I) (getopt_long kullanmak için bir program yazdım, aşağıda yanıtlarından -aGetopt- Bağımsız değişken için dize parametresi

DÜZENLEME

olarak tek karaktere sahip, ancak switch deyimi tek bir tez zaman tanır Uzun argümanı değil karakter argümanını kullanırım. Bunun neden böyle olduğundan emin değilim. -mf -file sample argümanlarını geçerken, baskı ifadelerini göremiyorum.

DÜZENLEME

Ben --file olarak komut argümanlar girerek çalıştı ve sonra işe yaradı. Bunu sadece -file ile yapmak mümkün değil mi?

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; 
    } 
} 

cevap

15

Oku man getopthttp://linux.die.net/man/3/getopt

SÇNDİZGESİ meşru seçenek karakterleri içeren bir dizedir. böyle bir karakteri bir iki nokta üst üste izlerse, bu seçenek argümanı gerektirir, bu nedenle getopt() aynı argv öğesinde veya aşağıdaki argv öğesinin metninde optarg öğesinde bir işaretçi atar . İki punto bir seçenek isteğe bağlı bir arg alır anlamına gelir; mevcut Argv-elemanı (yani, bir seçenek adı kendisi ile aynı kelime, örneğin, "-oarg"), o zaman aksi sıfıra ayarlanır OPTARG, OPTARG'a döndürülür olarak bir metin var ise.

Bir örnek kod: optstring yılında Burada

#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; 
} 

"i: o:" kolon ':' dizedeki her karakterin ardından karakter o seçenekler bir argüman gerektireceğini söyler. Argümanı, optarg genel değişkeninde bir dize olarak bulabilirsiniz. Detay ve daha fazla örnek için kılavuza bakın.

birden fazla karakter seçeneği anahtarlar için, uzun seçenekleri getopt_long bakın. Örnekler için kılavuza bakın. Tek cevaben

DÜZENLEME '-' Uzun seçenekleri: getopt_long_only man sayfaları

itibaren

()() getopt_long gibidir, ama '-' yanı "olarak - - "uzun bir seçenek belirtebilir. '-' ("-" değil) ile başlayan bir seçenek uzun bir seçenekle eşleşmiyorsa, ancak kısa bir seçenekle eşleşiyorsa, bunun yerine kısa bir seçenek olarak ayrıştırılır.

kontrol manuel ve bunu deneyin.

+0

ama benim program argümanları kabul edilmez. Kodumu yukarıda ekledim. – AndroidDev93

+0

@ AndroidDev93: Düzenlememi kontrol et – phoxis

8

Bir bayrağın bir argüman gerektirdiğini belirtmek için, short_opt değişkenindeki bayraktan hemen sonra bir ':' ekleyin. Uzun argümanlar kullanmak için getopt_long() kullanın.

Burada hızlı bir örnek programıdır: Ben getopt_long kullanarak denedi

#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); 
} 
+0

Getopt_long() için kullanabileceğim farklı bağımsız değişkenlerin sayısı için bir sınır var mı? 17 farklı argümanım var ve sadece argümanın karakter versiyonuna girdiğimde ve uzun argümana girmediğimde argümanı tanıyor. – AndroidDev93

+0

Sadece bellek ile sınırlı olduğuna inanıyorum. Long_opts'un son değerini mi güncelliyorsunuz? Örneğimde, her uzun seçenek kısa bir seçenekle eşleştirilir. Yani '--help' ve '-h' aynı seçenek. Ancak '--h' seçeneğini 'p' ile 'p' arasında değiştirerek ve 'p' dizesini short_opt dizesine ekleyerek '-p' seçeneği ile aynı olmasını sağlayabilirsiniz. –

+1

Sadece düzenlemeleri okudum. '-option' yerine '--option' kullanmalısınız. getopt() ve getopt_long() '-option'ı' -o -p -t -i -o -n 'olarak yorumlar. Tek bir çizgi ile uzun seçenekleri kullanmak istiyorsanız, kendi CLI argüman çözümleyicinizi yazmanız veya istediğiniz davranışa uyan mevcut bir bulmayı denemeniz gerekecektir. –

İlgili konular