Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: hướng dẫn dùng thư viện getopt.h

  1. #1
    Ngày gia nhập
    09 2011
    Bài viết
    84

    Mặc định hướng dẫn dùng thư viện getopt.h

    C Code:
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <getopt.h>
    4. void die(const char *string){
    5.     puts(string);
    6.     exit(EXIT_FAILURE);
    7. }
    8. int printv(char **argv){
    9.     while(*argv){
    10.         printf("%s\n",*argv);
    11.         argv++;
    12.     }
    13. }
    14. const char *version="command version 1.0\nWritten by phamthechung0@gmail.com\
    15. \ndate:7/6/2012";
    16. const char *usage="cmd -cvh file file2";
    17. int main(int argc,char **argv){
    18.     int ch=0;
    19.     if(argc<2) printf(usage);
    20.     while((ch=getopt(argc,argv,"cvh"))!=-1){
    21.         switch(ch){
    22.             case 'v':printf(version);exit(0);
    23.                 break;
    24.             case 'h':printf("usage: cmd -cvh file.sh");exit(0);
    25.                 break;
    26.             case 'c': if(argc<3) die("not enough argument");
    27.                 printv(argv+2);
    28.                 break;
    29.             default: puts("unknown argument");
    30.                 break;
    31.         }
    32.     }
    33. }
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    RISC better than CISC
    phamthechung0@gmail.com

  2. #2
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    Mình bổ xung chút

    Hàm getopt() có nhiệm vụ phân tích cú pháp các đối số command-line.
    2 đối số của getopt() là argc và argv, tương ứng là số và mảng các đối số được nhập vào hàm main() khi chương trình được gọi.
    Một phần tử của argv bắt đầu với '-' ( không chính xác là '-' hay '--' ) được gọi là 1 option element.
    Kí tự của 1 option element ( bắt đầu từ bên phải '-' ) là những option character.
    Nếu getopt() được gọi lặp, nó sẽ return những option character từ những option element.
    Biến optind là chỉ số của element tiếp theo sẽ được xử lý trong argv.
    Hệ thống khởi tạo biến này với giá trị 1. Caller có thể reset nó tới 1.
    Nếu getopt() tìm thấy 1 option character nào khác, nó sẽ return character đó và update optind và biến static nextchar.
    Nếu getopt() không tìm thấy option character nào nữa, nó return -1. optind là chỉ số của phần tử đầu tiên trong argv mà không phải là 1 option.
    optstring là 1 string chứa các option character hợp lệ. Nếu 1 character như vậy được theo sau bởi 1 dấu 2 chấm, option đó yêu cầu 1 đối số, vậy nên getopt() sẽ dùng optarg để trỏ tới text của đối số đó. 2 dấu 2 chấm nghĩa là option đó yêu cầu nhận 0 hoặc 1 đối số, vậy nên optarg sẽ trỏ tới đối số đó hoặc bằng 0 nếu không có đối số nào.
    Theo mặc định, getopt() sẽ thay đổi các phần tử trong argv khi nó scan. Vậy nên khi scan xong, tất cả các non-option sẽ ở cuối mảng.
    Có 2 chế độ khác nữa:
    • Nếu kí tự đầu tiên trong optstring là '+' hoặc biến môi trường POSIXLY_CORRECT được set, thì việc xử lý các option sẽ dừng ngay khi gặp 1 đối số non-option.
    • Nếu kí tự đầu tiên trong optstring là '-', thì mỗi element non-option trpng argv sẽ được xử lý như là 1 đối số của 1 option với character code 1.
    Nếu getopt() tìm thấy 1 option character không hợp lệ, nó sẽ in 1 thông báo lỗi tới stderr, lưu kí tự đó tới optopt và return '?'. Caller có thể chặn thông báo lỗi bằng việc set opterr = 0.

    Ngoài getopt(), còn có hàm getopt_long() cũng tương tự như getopt(), getopt_long() cũng xử lý cả long option, nhưng long option của mà nó nhận phải bắt đầu với 2 dấu gach ngang "--".

    Một ví dụ đơn giản sử dụng getopt_long() :

    C++ Code:
    1. #include <stdio.h>     /* for printf */
    2. #include <stdlib.h>    /* for exit */
    3. #include <getopt.h>
    4.  
    5.  
    6. int main(int argc, char **argv)
    7. {
    8.    int c;
    9.    int digit_optind = 0;
    10.  
    11.    while (1)
    12.    {
    13.        int this_option_optind = optind ? optind : 1;
    14.        // chí số option trong mảng long_option
    15.        int option_index = 0;
    16.        // mảng long_option
    17.        static struct option long_options[] =
    18.        {
    19.            {"add",     required_argument, 0,  0 },
    20.            {"append",  no_argument,       0,  0 },
    21.            {"delete",  required_argument, 0,  0 },
    22.            {"verbose", no_argument,       0,  0 },
    23.            {"create",  required_argument, 0, 'c'},
    24.            {"file",    required_argument, 0,  0 },
    25.            {0,         0,                 0,  0 }
    26.  
    27.        };
    28.        
    29.        c = getopt_long(argc, argv, "abc:d:012", long_options, &option_index);
    30.        // nếu không tìm thấy option nào
    31.        if (c == -1)
    32.            break;
    33.  
    34.        switch (c)
    35.        {
    36.        case 0:
    37.             // in ra tên option đang xử lý
    38.             printf("option %s", long_options[option_index].name);
    39.             // in ra đối số đi kèm option
    40.             if (optarg)
    41.                 printf(" with arg %s", optarg);
    42.             printf("\n");
    43.             break;
    44.  
    45.        case '0':
    46.        case '1':
    47.        case '2':
    48.            if (digit_optind != 0 && digit_optind != this_option_optind)
    49.              printf("digits occur in two different argv-elements.\n");
    50.            digit_optind = this_option_optind;
    51.            printf("option %c\n", c);
    52.            break;
    53.  
    54.        case 'a':
    55.            printf("option a\n");
    56.            break;
    57.  
    58.        case 'b':
    59.            printf("option b\n");
    60.            break;
    61.  
    62.        case 'c':
    63.            printf("option c with value '%s'\n", optarg);
    64.            break;
    65.  
    66.        case 'd':
    67.            printf("option d with value '%s'\n", optarg);
    68.            break;
    69.  
    70.        case '?':
    71.            break;
    72.  
    73.        default:
    74.            printf("?? getopt returned character code 0%o ??\n", c);
    75.        }
    76.    }
    77.  
    78.    if (optind < argc) {
    79.        printf("non-option ARGV-elements: ");
    80.        while (optind < argc)
    81.            printf("%s ", argv[optind++]);
    82.        printf("\n");
    83.    }
    84.  
    85.    exit(EXIT_SUCCESS);
    86. }

  3. #3
    Ngày gia nhập
    09 2011
    Bài viết
    84

    sao hàm getopt_long phải nằm trong while(1)
    RISC better than CISC
    phamthechung0@gmail.com

  4. #4
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    The getopt() function parses the command-line arguments. Its arguments argc and argv are the argument count and array as passed to the main() function on program invocation. An element of argv that starts with '-' (and is not exactly "-" or "--") is an option element. The characters of this element (aside from the initial '-') are option characters. If getopt() is called repeatedly, it returns successively each of the option characters from each of the option elements.
    Return Value

    If an option was successfully found, then getopt() returns the option character. If all command-line options have been parsed, then getopt() returns -1. If getopt() encounters an option character that was not in optstring, then '?' is returned. If getopt() encounters an option with a missing argument, then the return value depends on the first character in optstring: if it is ':', then ':' is returned; otherwise '?' is returned.

    getopt_long() and getopt_long_only() also return the option character when a short option is recognized. For a long option, they return val if flag is NULL, and 0 otherwise. Error and -1 returns are the same as for getopt(), plus '?' for an ambiguous match or an extraneous parameter.
    Code:
    http://linux.die.net/man/3/getopt_long
    Hiểu đơn giản :

    argc sẽ chứa số đối số.
    argv là mảng các đối số.

    Mỗi phần tử của argv bắt đầu với '-' được gọi là 1 'option element'.
    Các kí tự bên phải '-' hoặc '--' của mỗi 'option element' được gọi là 'option characters'. ( với getopt_long() , gặp 'option element' bắt đầu với '--' thì chuyển nó về short option tương ứng để xử lý ).

    Nếu gọi lặp getopt_long(), thì nó sẽ return lần lượt từng 'option characters' của mỗi 'option element' trong argv, dưới dạng short option ( tức là khi gặp '--' là long option thì nó chuyển về short option như đã nói ở trên ). Khi hết thì return -1.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Đã được chỉnh sửa lần cuối bởi luc13aka47 : 01-02-2013 lúc 06:40 PM.

Các đề tài tương tự

  1. Upload file dùng Ajax mà ko dùng Method Post của Form như thế nào?
    Gửi bởi hieupxd2cntt trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 8
    Bài viết cuối: 14-09-2014, 10:23 PM
  2. Lập trình C Thư viện getopt và vấn đề dịch mã nguồn C- Linux trên Windows
    Gửi bởi anhtuanbkitpro trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 1
    Bài viết cuối: 02-04-2013, 10:09 PM
  3. Bài toán quản lí nhân viên dùng dùng danh sách liên kết trong C++. Mong mọi người góp ý!
    Gửi bởi rataki trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 1
    Bài viết cuối: 22-11-2012, 11:26 PM
  4. Bài tập C++ Dùng strtok cắt chuỗi và lỗi khi dùng atof() chuyển char sang float
    Gửi bởi salomontong trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 10-03-2012, 05:18 PM
  5. Bài tập C Lỗi Ko sử dụng đc hàm getopt , getRand .
    Gửi bởi whiskyak trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 20-03-2010, 08:06 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn