Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Hàm getopt() trong C - Phân tích đối số dòng lệnh

getopt() là hàm chuẩn POSIX (header <unistd.h>) giúp phân tích (parse) các tùy chọn dòng lệnh (command-line options) một cách có hệ thống, hỗ trợ cả tùy chọn có đối số và không có đối số.

Chữ ký hàm

int getopt(int argc, char *const argv[], const char *optstring);

Tham số optstring

  • Chuỗi chứa các ký tự tùy chọn hợp lệ.
  • Ký tự theo sau ':' → tùy chọn bắt buộc có đối số (ví dụ: "f:" nghĩa là -f filename).
  • Ký tự theo sau '::' (GNU extension) → tùy chọn có đối số tùy chọn.
  • Nếu optstring bắt đầu bằng ':' → phân biệt lỗi "thiếu đối số" (trả về ':') và "tùy chọn không hợp lệ" (trả về '?').

Biến toàn cục quan trọng

BiếnÝ nghĩa
optargCon trỏ đến đối số của tùy chọn hiện tại (nếu có).
optindChỉ số phần tử tiếp theo trong argv sẽ được xử lý (dùng để lấy positional arguments sau các option).
optoptKý tự tùy chọn gây lỗi (khi trả về '?').
opterrNếu = 0, tắt thông báo lỗi mặc định của getopt.

Giá trị trả về

  • Ký tự tùy chọn (ví dụ: 'f') nếu thành công.
  • ':' — tùy chọn thiếu đối số (chỉ khi optstring bắt đầu bằng ':').
  • '?' — tùy chọn không nhận diện.
  • -1 — không còn tùy chọn nào.

Ví dụ hoàn chỉnh

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

int main(int argc, char *argv[]) {
    int opt;
    // ':' đầu tiên: bật chế độ phân biệt lỗi thiếu đối số
    // "if:lrx" → -i, -l, -r, -x không có đối số; -f CÓ đối số
    while ((opt = getopt(argc, argv, ":if:lrx")) != -1) {
        switch (opt) {
            case 'i': case 'l': case 'r': case 'x':
                printf("Tuy chon: -%c\n", opt);
                break;
            case 'f':
                printf("Tuy chon -f voi doi so: %s\n", optarg);
                break;
            case ':':
                printf("Loi: Tuy chon -%c can doi so!\n", optopt);
                break;
            case '?':
                printf("Loi: Tuy chon khong hop le: -%c\n", optopt);
                break;
        }
    }

    // Xử lý các positional arguments (không phải option)
    for (; optind < argc; optind++) {
        printf("Tham so them: %s\n", argv[optind]);
    }
    return 0;
}

Chạy thử

$ ./a.out -i -f test.txt -l -r hello
Tuy chon: -i
Tuy chon -f voi doi so: test.txt
Tuy chon: -l
Tuy chon: -r
Tham so them: hello

Mẹo & Lưu ý

  • getopt tự động sắp xếp lại argv (option trước, non-option sau) — hành vi GNU mặc định. Dùng POSIXLY_CORRECT env var để tắt.
  • Để reset parse (dùng cho subcommand), gán optind = 1.
  • getopt_long() (GNU) hỗ trợ long option (--help, --version).
  • Trên Windows (MSVC), getopt không có sẵn — cần triển khai riêng hoặc dùng thư viện như getopt_port.

getopt() là công cụ chuẩn, nhẹ, không phụ thuộc thư viện ngoài — lý tưởng cho CLI tool C/C++ đơn giản.