2013-07-26 39 views
8

Tôi có một chương trình nhận nhiều đối số dòng lệnh vì vậy tôi đang sử dụng getopt. Một trong các đối số của tôi có một chuỗi như một tham số. Có anyway để có được chuỗi đó thông qua các chức năng getopt hoặc tôi sẽ có để có được nó thông qua các mảng argv []? Cũng có thể getopt đọc args như -file? Tất cả những lập luận tôi đã thấy cho đến bây giờ chỉ có một nhân vật như -aGetopt- Thông số chuỗi truyền cho đối số

EDIT

Từ các câu trả lời dưới đây tôi đã viết một chương trình để sử dụng getopt_long(), nhưng câu lệnh switch chỉ công nhận các đối số khi Tôi sử dụng đối số ký tự chứ không phải đối số dài. Tôi không chắc tại sao điều này lại xảy ra. Khi chuyển các đối số -mf -file sample Tôi không thấy các câu lệnh in.

EDIT

tôi đã cố gắng xâm nhập vào đối số lệnh như --file và sau đó nó làm việc. Không thể thực hiện việc này chỉ với -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; 
    } 
} 

Trả lời

15

đọc man getopthttp://linux.die.net/man/3/getopt

OPTSTRING là một chuỗi chứa ký tự tùy chọn hợp pháp. Nếu ký tự như vậy được theo sau bởi dấu hai chấm, tùy chọn yêu cầu đối số , do đó, getopt() đặt con trỏ đến văn bản sau trong cùng một phần tử argv hoặc văn bản của phần tử argv sau, trong optarg . Hai dấu hai chấm có nghĩa là một tùy chọn có một tùy chọn arg; nếu có văn bản trong phần tử argv hiện tại (nghĩa là, trong cùng một từ với tùy chọn tên chính nó, ví dụ: "-oarg"), thì nó được trả về trong optarg, nếu không, optarg được đặt thành 0.

Một mã mẫu:

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

đây trong optstring là "i: o:" ruột kết ':' nhân vật sau mỗi ký tự trong chuỗi nói rằng những tùy chọn này sẽ đòi hỏi một cuộc tranh cãi. Bạn có thể tìm đối số dưới dạng chuỗi trong biến số toàn cầu optarg. Xem hướng dẫn sử dụng để biết chi tiết và các ví dụ khác.

Đối với nhiều công tắc tùy chọn ký tự, hãy xem các tùy chọn dài getopt_long. Kiểm tra hướng dẫn để biết ví dụ.

EDIT để đáp ứng với đĩa đơn '-' tùy chọn dài:

Từ trang người đàn ông

getopt_long_only() cũng giống như getopt_long(), nhưng '-' cũng như "- - "có thể chỉ ra một tùy chọn dài. Nếu tùy chọn bắt đầu bằng '-' (không phải "-") không khớp với tùy chọn dài, nhưng không khớp với tùy chọn ngắn, thì thay vào đó, tùy chọn này được phân tích thành tùy chọn ngắn.

Kiểm tra hướng dẫn và dùng thử.

+0

Tôi đã cố gắng sử dụng getopt_long, nhưng chương trình của tôi không được công nhận các đối số. Tôi đã thêm mã của mình ở trên. – AndroidDev93

+0

@ AndroidDev93: Kiểm tra chỉnh sửa của tôi – phoxis

8

Để chỉ định cờ yêu cầu đối số, hãy thêm dấu ':' ngay sau cờ trong biến short_opt. Để sử dụng các đối số dài, sử dụng getopt_long().

Dưới đây là một chương trình ví dụ nhanh:

#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

Có giới hạn về số đối số khác nhau mà tôi có thể sử dụng cho getopt_long() không? Tôi có 17 đối số khác nhau và nó chỉ nhận ra đối số khi tôi nhập phiên bản ký tự của đối số chứ không phải đối số dài. – AndroidDev93

+0

Tôi tin rằng bạn chỉ bị giới hạn bởi bộ nhớ. Bạn đang cập nhật giá trị cuối cùng của long_opts? Trong ví dụ của tôi, mỗi tùy chọn dài được ghép nối với một tùy chọn ngắn. Vì vậy, '--help' và '-h' là cùng một tùy chọn. Tuy nhiên, bạn có thể làm cho '--help' giống như tùy chọn '-p' bằng cách thay đổi 'h' thành 'p' và thêm 'p' vào chuỗi short_opt. –

+1

Tôi chỉ đọc các chỉnh sửa của bạn. Bạn phải sử dụng '--option' thay vì '-option'. getopt() và getopt_long() sẽ diễn giải '-option' là '-o -p -t -i -o -n'. Nếu bạn muốn sử dụng các tùy chọn dài với một dấu gạch ngang, bạn sẽ phải viết trình phân tích cú pháp đối số CLI của riêng bạn hoặc cố tìm một trình phân tích cú pháp hiện có phù hợp với hành vi mong muốn của bạn. –

Các vấn đề liên quan